释放在块中间声明的C指针(寻求关于此的文档)

时间:2013-04-18 09:56:48

标签: c pointers malloc declaration

记录此行为的位置(如果有的话)?

当您在块中间的C中声明指针时,它可能处于错误状态(指向不可用的内存),并且您无法使用标准if (a) free(a)来释放它。

想到的最简单的程序是

#include <stdlib.h>
int main(int argc, char *argv[]){
    if(argc > 1) goto END;
    char *a = NULL;
    a = calloc(1,1);
END:
    if(a) free(a);
}

运行没有参数的程序,它运行正常,如果你用至少一个参数运行它,它可能会破坏如下: 令人惊讶的是(对我来说),如果你用clang编译它,它可能会工作(在我的OS X上它确实有效,但在NetBSD上却没有)。如果你使用gcc,它总是返回一个

malloc: *** error for object 0x7fff5fc01052: pointer being freed was not allocated

请注意,与块头部的声明相同的程序是正确的。

修改:请注意,问题是关于文档。我意识到我所描述的是不安全的,但我找不到明确显示它的地方。

1 个答案:

答案 0 :(得分:3)

&#34;模式&#34;

if(a) free(a);

当然不是标准,或者至少它不应该是标准。 安全NULL传递给free(),因此if无法添加

如果你跳过初始化,我希望a的值是未定义的(不太可能是NULL),这对我来说非常有意义。这真是毛茸茸的代码,不要这样做。

可以说,goto和标签的存在意味着没有实现的范围,并且free(a);语句完全没有理由标签(&#34;不可见&#34;定义a的范围)。