C自动变量

时间:2014-08-04 14:47:17

标签: c static

如果我们使用free()释放自动变量会怎样?

在以下代码中如何:如果nstatic,它会在最后一次循环迭代后自动获取,我们可以free,还是什么?

for(count = 0; count < 5; count++) {  
    static int i += 1
}

4 个答案:

答案 0 :(得分:3)

  

如果我们使用free()释放自动变量会怎样?

它将调用未定义的行为

free的参数必须是内存分配函数返回的指针malloccallocrealloc)。

答案 1 :(得分:0)

如果free()是自动变量,则结果未定义。

static变量由运行时清理。没有必要free他们。

free仅用于您使用malloc/calloc

分配的指针

答案 2 :(得分:0)

free唯一有效参数是之前调用其中一个*alloc函数(malloccalloc的结果,或realloc)或NULL。而已。

auto个变量在其封闭范围的生命周期内存在;尝试在其中调用free将调用未定义的行为(可能导致访问冲突或段错误)。

static变量在程序的生命周期中存在,即使它们的可见性仅限于特定范围; i循环中的for在程序启动时分配并保持到程序终止,但只能在for循环的范围内访问。与auto变量一样,尝试在静态变量上调用free将调用未定义的行为,并可能导致运行时错误。

答案 3 :(得分:0)

free()的单个参数是指针,传递非指针将无法编译,所以问题没有实际意义。

传递先前未从堆分配函数返回但以前未传递给free()指针的效果未定义 - 但从未有用,或纠正,通常是致命的。

实际上,free()将假定指针是从堆分配的块;实现可能会检测到错误,或者它可能会破坏堆。可能无法检测到错误,并且在稍后的堆操作中将导致本质上未定义的故障,这使得确定原始原因非常困难。

在典型的实现中,分配的块前面是堆元数据; free()通过从传递给它的指针中减去元数据的大小来访问此数据。对于非堆分配的指针,读取的数据将是无效的废话。该实现可能能够验证此数据并导致运行时错误,但在一个简单的实现中,元数据可能只包含块的大小,并且可能会将未定义大小和不适当位置的块添加到堆中。