首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于realloc函数的混淆

关于realloc函数的混淆
EN

Stack Overflow用户
提问于 2017-11-13 14:14:51
回答 3查看 198关注 0票数 4

我使用引用阅读了C中的动态内存分配。

文件上说:

realloc()应该只用于动态分配的内存。如果未动态分配内存,则未定义行为。

如果我们使用realloc(),如下所示:

代码语言:javascript
复制
int main()
{
    int *ptr;
    int *ptr_new = (int *)realloc(ptr, sizeof(int));

    return 0;
}

根据该引用,该程序未定义,因为指针ptr没有动态分配。

但是,如果我用的是:

代码语言:javascript
复制
int main()
{
    int *ptr = NULL;
    int *ptr_new = (int *)realloc(ptr, sizeof(int));

    return 0;
}

根据这个引用,它也是未定义的行为吗?

我认为第二种情况不会引发未定义的行为。我说的对吗?

EN

回答 3

Stack Overflow用户

发布于 2017-11-13 14:21:42

在第一种情况下,程序几乎肯定会由segmentation fault完成,因为在堆中创建的用于查找段的链接列表是不连贯的,在第二种情况下,您使用空的第一个参数调用realloc,这意味着相当于malloc(size)的调用。

man realloc说:

代码语言:javascript
复制
   void *malloc(size_t size); 
   void *realloc(void *ptr, size_t size);

如果ptr为NULL,则对于大小的所有值,调用都等同于malloc( size )。

票数 1
EN

Stack Overflow用户

发布于 2017-11-13 14:25:44

唯一的授权参考是标准文件。n1570 (最新的C11标准)有以下几点:

§7.22.3.5 函数,p3

如果ptr是空指针,则realloc函数的行为与指定大小的malloc函数类似。否则,如果ptr与内存管理函数先前返回的指针不匹配,或者如果空间已通过调用freerealloc函数而被释放,则行为未定义。..。

因此,您的第二个示例定义得很好。

票数 1
EN

Stack Overflow用户

发布于 2017-11-13 14:31:00

  1. 第一种情况显然是未定义的行为,因为我们不知道ptr指向的位置或ptr当时持有的是什么。C标准说7.20.3.4.2是realloc函数

realloc函数释放ptr所指向的旧对象,并返回指向大小指定大小的新对象的指针。

所以第一种情况是未定义的行为。

  1. 在第二种情况下,编译器知道ptr有什么,所以它是有效的,但是realloc()将根据7.20.3.4.3 7.20.3.4.3函数充当malloc()

如果ptr是空指针,那么realloc函数的行为就像malloc函数一样具有指定的大小。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47266371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档