是否可以从 C 中指向 NULL 的指针重新分配内存?
int *v = 0;
for(i = 0; i < 10; i++)
v = (int *) realloc(v, (i+1)*sizeof(int));
“如果 ptr 为 NULL,该函数的行为与 malloc 完全相同,分配一个新的 size 字节块并返回一个指向它开头的指针。”
http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/
顺便说一句,我知道这段代码只是为了解决这个问题,但你应该在更新指针之前检查 realloc 的返回值:
int *p,*tmp;
tmp = (int *)realloc(p, nBytes);
if(tmp){
p = tmp;
}
else{
//Out of memory!
}
否则,当 realloc 失败时,您将失去对分配内存的引用。
如果 ptr 为 NULL,则对于所有 size 值,调用等效于 malloc(size)。
来源: man 3 realloc
从标准
7.20.3.4/3 ... 如果 ptr 是空指针,则 realloc 函数的行为类似于指定大小的 malloc 函数。
从手册页:
如果 ptr 为 NULL,则调用等效于 malloc(size); 如果 size 等于 0,则调用等效于 free(ptr)。除非 ptr 为 NULL,否则它一定是由先前对 malloc()、calloc() 或 realloc() 的调用返回的。
但是,您不应该忘记,如果它不能调整内存大小,它realloc()
可以返回NULL。如果发生这种情况,您发布的代码可能会导致分配多个内存块,因为 NULL 返回值将被反馈到realloc()
该内存块中,然后分配一个新块。(希望您并没有真正使用该代码......)
从 realloc手册页:
realloc() 将 ptr 指向的内存块的大小更改为 size 字节。内容将不变为新旧尺寸中的最小值;新分配的内存将未初始化。如果 ptr 为 NULL,则调用等效于 malloc(size); 如果 size 等于 0,则调用等效于 free(ptr)。除非 ptr 为 NULL,否则它一定是由先前对 malloc()、calloc() 或 realloc() 的调用返回的。如果指向的区域被移动,则执行 free(ptr)。