gpt4 book ai didi

c - 重新分配后如何将新内存清零

转载 作者:太空狗 更新时间:2023-10-29 16:59:51 26 4
gpt4 key购买 nike

调用 realloc 后将新内存清零同时保持初始分配的内存完好无损的最佳方法是什么?

#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();
}

最佳答案

作为一般模式,没有办法解决这个问题。原因是为了知道缓冲区的哪一部分是新的,您需要知道旧缓冲区的长度。在 C 中无法确定这一点,因此无法获得通用解决方案。

但是你可以像这样写一个包装器

void* realloc_zero(void* pBuffer, size_t oldSize, size_t newSize) {
void* pNew = realloc(pBuffer, newSize);
if ( newSize > oldSize && pNew ) {
size_t diff = newSize - oldSize;
void* pStart = ((char*)pNew) + oldSize;
memset(pStart, 0, diff);
}
return pNew;
}

关于c - 重新分配后如何将新内存清零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2141277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com