munmap_chunk() 的奇怪行为

Bizarre behaviour of munmap_chunk()

我有这段错误代码

#include <stdlib.h>

int main()
{
    int arr[] = { 1,2,3,5, 9, 0, 9, 3, -88, -64 };
    int *count;
    free(count);
    return 0;
}

按预期工作并给出 munmap_chunk(): invalid pointer 错误。但是当删除在 main 中声明 arr 的行时,我没有看到任何错误,我也不明白为什么。在这两种情况下,我都释放了一个野指针,那么为什么前者会显示错误呢?我正在使用 onlinegdb 的 C 编译器(这是 gcc afaik)。

“野指针”不是东西。也就是说,没有指针这样的东西具有 属性 的野性。

调用 free(count) 时,由于使用未初始化的自动对象的特殊规则,C 标准未定义该行为。但是,如果 C 实现确实为此代码调用 free,它会为参数传递一些值。

如果有人说这是一个“狂野”值,他们并不意味着传递了任何特定值或任何特定类型的值。他们的意思是价值不受控制。因为不受控制,可以是0,可以是arr的地址,也可以是栈上某物的地址,可以是main的地址,也可以是main的地址什么都没有的地址,它可能是一个根本无效的地址值。

在您尝试的任何实验中,当存在 int arr 声明时,某些值会传递给 free,从而导致您看到错误消息。当声明不存在时,一些其他值被传递给 free 并没有导致错误消息。传递的值可能只是在 main 执行之前的程序初始化之后发生在堆栈或程序寄存器中的偶然事件。删除声明可能偶然更改了内存或寄存器中发生的内容,或者可能更改了编译器在调用 free.

时用来代替 count 的内存或寄存器。

要求编译器显示两个程序的汇编代码(使用 GCC 的 -S 开关)可能会显示更多关于发生的事情。