【问题标题】:Validity of the realloc() function in CC 中 realloc() 函数的有效性
【发布时间】:2014-01-02 08:40:28
【问题描述】:

pointer = (int*)realloc(0, sizeof(int))

一个有效的表达式?

我觉得由于realloc的第一个参数是一个指针,这里是0(为操作系统保留的内存地址),这个语句不应该是一个有效的语句。有人可以评论声明的有效性吗?

【问题讨论】:

  • 不要在 C 中转换 malloc(和朋友)的返回值
  • 0 真的是操作系统保留的还是只是C的解释?
  • @Bathsheba:C 只是保证空指针比较等于 0。操作系统对地址 0 所做的任何事情显然都是特定于所述操作系统的。

标签: c pointers realloc


【解决方案1】:

这是有效的陈述。

C 标准第 7.22.3.5 节:

void *realloc(void *ptr, size_t size);

如果ptr 是空指针,realloc 函数的行为类似于 malloc 函数 规定的大小。否则,如果 ptr 与内存先前返回的指针不匹配 管理功能,或者如果空间已通过调用 free 或 realloc 函数,行为未定义。如果新对象的内存不能 已分配,旧对象不会被释放,其值不变。

【讨论】:

    【解决方案2】:

    根据 C 2011 6.3.2.3 3,0 可用作空指针常量:

    值为 0 的整数常量表达式,或类型转换为 void * 的表达式称为 空指针常量。如果将空指针常量转换为指针类型,则生成的指针(称为 空指针)保证与指向任何对象或函数的指针不相等。

    在对realloc 的调用中,0 参数会根据 6.5.2.2 7 自动转换为参数的类型 void *

    如果表示被调用函数的表达式具有包含原型的类型,则参数将隐式转换为相应参数的类型,就像通过赋值一样,将每个参数的类型作为非限定版本其声明的类型。

    【讨论】:

      【解决方案3】:

      来自man realloc

      如果 ptr 为 NULL,则调用等价于 mal- loc(size),适用于所有大小值;如果 size 等于 0,并且 ptr 是 不为NULL,则调用等价于free(ptr)。除非 ptr 是 NULL,它一定是由先前对 malloc() 的调用返回的, loc() 或 realloc()。如果指向的区域被移动,则 free(ptr) 为 完成。

      总而言之,当第一个参数为NULL时,它相当于malloc(),因此有效。

      【讨论】:

        猜你喜欢
        • 2015-07-13
        • 1970-01-01
        • 2013-09-19
        • 1970-01-01
        • 2020-10-26
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        • 2012-11-24
        相关资源
        最近更新 更多