是
pointer = (int*)realloc(0, sizeof(int))
有效的表达方式?
我觉得因为realloc
的第一个参数是一个指针,这里它是0(为操作系统保留的内存地址),所以这个语句不应该是有效的。有人可以对声明的有效性发表评论吗?
答案 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
,所以有效的陈述。