我使用this引用读了C中的动态内存分配。
那个文件Say:
realloc()只应用于动态分配的内存。如果 内存未动态分配,行为未定义。
如果我们使用realloc()
这样的内容:
int main()
{
int *ptr;
int *ptr_new = (int *)realloc(ptr, sizeof(int));
return 0;
}
根据该引用,该程序未定义,因为指针ptr未动态分配。
但是,如果我使用类似的东西:
int main()
{
int *ptr = NULL;
int *ptr_new = (int *)realloc(ptr, sizeof(int));
return 0;
}
根据该引用,它是否也是未定义的行为?
我的第二种情况不会调用未定义的行为。我是对的吗?
答案 0 :(得分:10)
第一种情况有未定义的行为,第二种情况没有。在第一种情况下,ptr
的值是不确定的。因此,将该值传递给realloc
或任何函数,本身是不确定的。
另一方面,由于realloc
在传递空指针值时具有明确定义的行为(它就像调用malloc
) 1 ,第二个一段代码是完全合法的(除了事实上你没有free
任何东西)。
1 7.22.3.5 realloc函数/ p3
如果ptr是空指针,则realloc函数的行为类似于指定大小的malloc函数。
答案 1 :(得分:1)
在第一种情况下,程序几乎肯定将由segmentation fault
完成,因为在堆中创建的链接列表不能连贯,在第二种情况下,您使用NULL第一个参数调用realloc,这意味着,是一个等同于malloc(size)
man realloc
说:
void *malloc(size_t size);
void *realloc(void *ptr, size_t size);
如果 ptr 为NULL,则对于所有大小值
,调用等效于malloc(size)
答案 2 :(得分:1)
唯一的授权参考是标准文档。 n1570(最新的C11标准)有如下说法:
§7.22.3.5realloc
函数,p3 :
如果
ptr
是空指针,则realloc
函数的行为类似于malloc
函数 指定大小。否则,如果ptr
与先前由内存返回的指针不匹配 管理功能,或者如果通过调用free
或已释放空间realloc
函数,行为未定义。 [...]
所以,你的第二个例子定义明确。
答案 3 :(得分:1)
realloc函数释放ptr和指向的旧对象 返回指向大小指定大小的新对象的指针。
所以第一种情况是未定义的行为。
realloc()
将根据 7.20.3.4.3 realloc函数 malloc()
醇>
如果ptr是空指针,则realloc函数的行为类似于 指定大小的malloc函数。