繁体   English   中英

C中realloc()函数的有效性

[英]Validity of the realloc() function in C

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

一个有效的表达?

我觉得既然第一个参数realloc是一个指针,这里是0(对于OS保留的内存地址),这种说法不应该是一个有效的。 有人可以对声明的有效性发表评论吗?

这是有效的声明。

C标准的§7.22.3.5:

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

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

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

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

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

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

man realloc

如果ptr为NULL,则对于所有size值,该调用等效于malloc(size)。 如果size等于零,并且ptr不为NULL,则该调用等效于free(ptr)。 除非ptr为NULL,否则它必须已由较早的malloc(),calloc()或realloc()调用返回。 如果指向的区域已移动,则执行free(ptr)。

总之,当第一个参数为NULL时,它等效于malloc() ,因此是有效的语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM