C中realloc()函数的有效性

时间:2014-01-02 08:40:29

标签: c pointers realloc

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

有效的表达方式?

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

3 个答案:

答案 0 :(得分:2)

这是有效的声明。

来自C标准的

7.22.3.5:

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

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

答案 1 :(得分:2)

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

  

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

在对realloc的调用中,0参数自动转换为参数类型void *,符合6.5.2.2 7:

  

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

答案 2 :(得分:0)

来自man realloc

  

如果ptr为NULL,则调用等同于mal-          loc(size),适用于所有大小值;如果size等于零,则ptr为          不是NULL,那么调用相当于free(ptr)。除非ptr是          NULL,它必须由之前调用malloc()返回,cal-          loc()或realloc()。如果指向的区域被移动,则自由(ptr)是          完成。

总之,当第一个参数为malloc()时,它等同于NULL,所以有效的陈述。