使用 c:
char ptr[n];
free(ptr);
在我看来:当“char ptr[n];” 已使用,内存已分配,并且 ptr 指向它, free(ptr) 应该可以工作。程序失败了,为什么?(n == 5 eg)有什么深入的分析吗?
使用 c:
char ptr[n];
free(ptr);
在我看来:当“char ptr[n];” 已使用,内存已分配,并且 ptr 指向它, free(ptr) 应该可以工作。程序失败了,为什么?(n == 5 eg)有什么深入的分析吗?
因为您调用free
了未分配的变量malloc
。
这会导致未定义的行为。幸运的是,它会崩溃并且您可以检测到它,否则它可能会在最尴尬的时候崩溃。
您要求free
释放堆分配变量的内存,您拥有的是本地存储上的一个数组(假设它在一个函数中),它会在创建它的作用域({
,}
)结束时自动释放。
因为这是你正在做的未定义的行为。(这意味着它实际上可以做任何事情,包括崩溃、看似正常运行、让守护进程飞出你的鼻子等。)你只能free()
使用你获得的指针malloc()
。
自动数组不必是 free()'d。它们在作用域结束时被释放。
仅free
由 分配的对象malloc
。释放尚未分配的对象malloc
是未定义的行为。
因为 `char ptr[n];' 不在堆栈内存中声明一个数组,并且它具有块的范围,这意味着它在块完成时从内存中销毁。
但是当你使用malloc(size)
指针时,它会指向堆内存中的一块内存,它会占用程序员给它的范围。我的意思是,当你想销毁它时,你必须使用它,free(ptr)
否则操作系统会在程序完成后释放它。
因此,当您使用free
指向堆栈内存中的一块内存的指针时,它会导致未定义行为和程序崩溃,因为free
仅在HEAP内存上操作。
这看起来很相似,在 c 中对 free 的调用是否会失败(SO)
根据标准,行为是未定义的,在某些情况下,您的代码不会那么快崩溃。它可能会在执行过程中破坏堆并在很晚的时候崩溃,并使调试变得困难。
在某种程度上,它取决于 malloc/free 方法的设计。
我知道的一种方法是:对于每个 malloc,一个额外的内存块附加到 malloc() 返回的块。此块包含调用 free() 时需要的一些内务数据。在您的情况下,由于内存不是由 malloc() 分配的,因此缺少此数据。所以 free() 试图在不知道它的垃圾的情况下使用你的数组之前的数据。