Comment remettre à zéro les nouvelles de la mémoire après le realloc

Quel est le meilleur moyen de remettre à zéro les nouvelles de la mémoire après l'appel de realloc tout en gardant le initialement alloué de la mémoire intacte?

#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();
}
Cela a très de la mauvaise performance, quand une couleur est ajouté à la fin de la liste des couleurs, l'habitude d'appels. Vous n'aurez qu'à ajouter un élément à la fois avant réaffectation des. Tenir compte d'au moins l'allocation de max(i+1, décompte des couleurs * 2).
C'est juste un exemple pour illustrer le problème. La source est une table de hachage qui redimensionne par le premier numéro de l'IIRC

OriginalL'auteur Nick Van Brunt | 2010-01-26