Wie auf null raus, neuen Speicher nach realloc

Was ist der beste Weg, um null aus neue Speicher nach dem Aufruf von realloc, während der ursprünglich zugewiesenen Speicher intakt?

#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <stdio.h>

size_t COLORCOUNT = 4;

typedef struct rgb_t {
    int r;
    int g;
    int b;
} rgb_t;

rgb_t** colors;

void addColor(size_t i, int r, int g, int b) {
    rgb_t* color;
    if (i >= COLORCOUNT) {
        //new memory wont be NULL
        colors = realloc(colors, sizeof(rgb_t*) * i);
       //something messy like this...
        //memset(colors[COLORCOUNT-1],0 ,sizeof(rgb_t*) * (i - COLORCOUNT - 1));

         //...or just do this (EDIT)
        for (j=COLORCOUNT; j<i; j++) {
            colors[j] = NULL;
        }

        COLORCOUNT = i;
    }

    color = malloc(sizeof(rgb_t));
    color->r = r;
    color->g = g;
    color->b = b;

    colors[i] = color;
}

void freeColors() {
    size_t i;
    for (i=0; i<COLORCOUNT; i++) {
        printf("%x\n", colors[i]);
        //can't do this if memory isn't NULL
       //if (colors[i])
         //  free(colors[i]);

    }
}


int main() {
    colors = malloc(sizeof(rgb_t*) * COLORCOUNT);
    memset(colors,0,sizeof(rgb_t*) * COLORCOUNT);
    addColor(0, 255, 0, 0);
    addColor(3, 255, 255, 0);
    addColor(7, 0, 255, 0);


    freeColors();
    getchar();
}
  • Dies hat eine sehr schlechte Leistung, wenn man die Farbe wird Hinzugefügt, um das Ende der Liste der Farben, die übliche Aufruf-Muster. Sie werde nur hinzufügen, ein element in einer Zeit, bevor die Neuzuweisung. Betrachten Sie mindestens Zuweisung max(i+1, COLORCOUNT * 2).
  • Dies ist nur ein Beispiel um das problem zu veranschaulichen. Die eigentliche Quelle ist eine hash-Tabelle, die die Größe von Primzahl IIRC
Schreibe einen Kommentar