Jaki jest najlepszy sposób na wyzerowanie nowej pamięci po wywołaniu realloc przy zachowaniu pierwotnie przydzielonej pamięci w stanie nienaruszonym?Jak wyzerować nową pamięć po ponownym przydzieleniu
#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();
}
Ma to * bardzo * słabą wydajność, gdy jeden kolor zostanie dodany na końcu listy kolorów, jak zwykle we wzorcu wywołania. Dodajesz tylko jeden element na raz przed ponownym przydzieleniem. Rozważ co najmniej przydzielenie maksimum (i + 1, COLORCOUNT * 2). –
To tylko przykład ilustrujący problem. Rzeczywistym źródłem jest tablica haszująca, której rozmiar zmienia się według numeru głównego IIRC –