调用realloc后是否需要初始化(设置为0)内存?

我需要实现一个指向typedef指针的简单动态指针数组。
每次用户请求时使用realloc,数组大小将增加sizeof(指针)。
所以我拥有的是:

#include  #include  #include  typedef void* node; void printmem(node* a, int c) { int i; for (i = 0; i < c; ++i) { printf("%d\t\t%p\n", i, a[i]); } } int main(void) { node* nodes = NULL; int i = 0, count = 20; for (i = 0; i < count; ++i) { nodes = realloc(nodes, sizeof(node)); } printf("Done reallocating\n"); printmem(nodes, i); // free(a); return 0; } 

这给出了以下输出:

 Done reallocating 0 (nil) 1 (nil) 2 (nil) 3 0x20fe1 4 (nil) 5 (nil) 6 (nil) 7 (nil) 8 (nil) 9 (nil) 10 (nil) 11 (nil) 12 (nil) 13 (nil) 14 (nil) 15 (nil) 16 (nil) 17 (nil) 18 (nil) 19 (nil) 

我关注第3个元素及其内容。
这就是为什么我问我是否应该在新的realloc之后将内存设置为0。

编辑:
因此,正如HCOCO3所指出的C标准一样,对realloc的新调用是:
nodes = realloc(nodes, (i+1)*sizeof(node));
在那之后进行初始化,我做了这个: nodes[i] = NULL
这也很好。

EDIT2:
我现在有这个:

 int main(void) { node* nodes = NULL; int i = 0, count = 20; for (i = 0; i < count; ++i) { nodes = realloc(nodes, (i+1)*sizeof(node)); nodes[i] = NULL; if (i == 1) { nodes[i] = &count; } } printf("Done reallocating\n"); printmem(nodes, i); printf("\t*nodes[1] == %d\n", *(int*)nodes[1]); printf("\tAddress of count is %p\n", &count); // free(a); return 0; } 

嗯,一切都取决于。 你需要将内存初始化为0吗? 如果没有,那么不,你不需要做任何事情。 与malloc的情况一样, realloc不执行任何初始化。 通过原始块中存在的内存的任何内存都保持未初始化状态。

按照realloc()的定义

realloc(void * p,size_t size)将p指向的对象的大小更改为size 。 内容将保持不变,直至旧尺寸和新尺寸的最小值。 如果新大小较大,则新空间未初始化。 (来自Kernighan和Ritchie)

您可能必须初始化新空间。 当确定void *指向的地址将包含哪种数据时,您可以这样做。

请注意,空指针不必等于C中的文字0.它仅保证不等于任何有效指针。 此外,技术上允许空指针针对不同的指针类型(例如,函数指针与char指针)不同。

因此,简单地将内存初始化为零可能会调用未定义的行为。

所以初始化为NULL,是正确的! 这就是我所做的! – 克里斯

不,你需要做的是像这样抛出null:(void *)NULL,并将其写入内存位置。 但是你永远不会真正写入malloc的内存(通过将NULL传递给realloc)。 你基本上只是在你的printf中读取未初始化的内存(这是未定义的行为)。