2012-09-22 45 views
-2

用c:为什么“char ptr [n]; free(ptr);”​​导致程序失败?

char ptr[n]; 
    free(ptr); 

在我看来:当 “字符PTR [N]。”被使用,内存被分配,并且ptr被指向它,free(ptr)应该工作。 程序失败,为什么?(n == 5例如) 是否有深度分析?

+3

我知道这已经收到很多反对票,但为什么这是一个坏问题?这当然是一个非常天真的问题,但我认为它非常适合堆栈溢出。 – jleahy

回答

6

因为您在未分配malloc的变量上调用free
这会导致未定义的行为。幸运的是,它会崩溃,你可以检测到它,否则它会在最棘手的时候崩溃。

你叫free解除分配堆分配变量的内存,你有什么是本地存储阵列(假定它是一个函数),并在其创建的范围({})时,它会自动回收结束。

+0

如果问题更清楚,你能否在汇编层面解释它? – Al2O3

+2

@JohnSon在“汇编级别”这里没有什么特别有趣的地方(不管是什么意思)。标准规定它是这样的,因为它是合乎逻辑的,并且OS在它意外的事情发生时终止你的程序。就这样。 – 2012-09-22 09:13:20

+1

@JohnSon:根据标准,它是未定义的行为(UB)。你必须明白,UB意味着标准赋予实现自由,以任何可能的方式和他们想要的方式来处理这个问题。对于会发生什么,不会有普遍的答案幕后,因为没有任何要求发生的要求。 –

1

只有free已由malloc分配的对象。释放未被malloc分配的对象是未定义的行为。

2

因为这是未定义的行为,你在做什么。 (这意味着它可以从字面上做任何事情,包括崩溃,运行看起来很好,making daemons fly out of your nose等)。您只能使用free()您使用malloc()获取的指针。

自动数组不必自由()'d。当它们的作用域结束时,它们被释放。

0

由于`char ptr [n];'是要在STACK内存中声明一个数组,并且它具有该块的范围,这意味着块在完成时会从内存中销毁。

但是当您使用malloc(size)时,指针将指向内存中的一块内存,并且它取自程序员提供的范围。我的意思是,当你想销毁它时,你必须使用free(ptr)或者在程序结束后OS释放它。

所以,当你的指针指向一块内存在STACK内存使用free它导致未定义的行为和程序崩溃,因为free仅在HEAP内存操作。

0

这看起来很相似 can a call to free in c ever fail(SO) 该行为未按照标准定义,在某些情况下,您的代码不会很快崩溃。它可能会在执行期间非常晚的时候破坏堆并崩溃,并使调试类型变得困难。
在某种程度上它取决于malloc/free方法的设计。

我知道的一种方法是: 与每个malloc,一个额外的内存块附加到由malloc()返回的块。该块包含一些管家数据,这是在free()调用时需要的。在你的情况下,由于内存不是由malloc()分配的,因此缺少这些数据。所以免费() 正试图使用​​您的数组之前的数据,而不知道它的垃圾。

相关问题