C语言中free(p)与free(&p[0])的区别、有效性及编译器兼容性问题
关于free(p)与free(&p[0])的疑问解答
首先看你给出的代码示例:
int *p; p = (int *) calloc(sizeof(int), 1000); free(p); free(&p[0]);
下面分点解答你的问题:
1. 二者的区别
从内存地址层面来说,p 和 &p[0] 指向的是同一块内存的起始地址。根据C语言语法规则,p[0] 等价于 *(p + 0),对其取地址&p[0]就等于p + 0,也就是p本身。所以这两个表达式的结果完全一致,没有本质区别。
2. 是否都能释放内存
按照C标准规定,free函数只要求传入的参数是之前通过malloc/calloc/realloc分配的内存块的起始地址。因为p和&p[0]是同一个地址,所以单独调用其中任意一个,都能正常释放这块内存。但要注意:你代码里连续调用了两次free,这属于重复释放内存,是C语言中的未定义行为,会导致程序崩溃、内存损坏等不可预测的问题,这和用哪种写法无关。
3. 编译器差异问题
&p[0]在语义上完全等价于p,任何符合C标准的编译器都会将这两个表达式解析为同一个地址值,所以不会因为编译器不同产生错误。唯一的风险还是重复释放的问题,这是代码逻辑错误,和编译器实现无关。
内容的提问来源于stack exchange,提问作者Bảo Khanh Điện
相关产品推荐
相关产品推荐

