我使用这引用阅读了C中的动态内存分配。
文件上说:
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;
}根据这个引用,它也是未定义的行为吗?
我认为第二种情况不会引发未定义的行为。我说的对吗?
发布于 2017-11-13 14:21:42
在第一种情况下,程序几乎肯定会由segmentation fault完成,因为在堆中创建的用于查找段的链接列表是不连贯的,在第二种情况下,您使用空的第一个参数调用realloc,这意味着相当于malloc(size)的调用。
man realloc说:
void *malloc(size_t size);
void *realloc(void *ptr, size_t size);如果ptr为NULL,则对于大小的所有值,调用都等同于malloc( size )。
发布于 2017-11-13 14:25:44
唯一的授权参考是标准文件。n1570 (最新的C11标准)有以下几点:
§7.22.3.5 函数,p3
如果
ptr是空指针,则realloc函数的行为与指定大小的malloc函数类似。否则,如果ptr与内存管理函数先前返回的指针不匹配,或者如果空间已通过调用free或realloc函数而被释放,则行为未定义。..。
因此,您的第二个示例定义得很好。
发布于 2017-11-13 14:31:00
realloc函数释放ptr所指向的旧对象,并返回指向大小指定大小的新对象的指针。
所以第一种情况是未定义的行为。
realloc()将根据7.20.3.4.3 7.20.3.4.3函数充当malloc()。如果ptr是空指针,那么realloc函数的行为就像malloc函数一样具有指定的大小。
https://stackoverflow.com/questions/47266371
复制相似问题