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
开关)可能会显示更多关于发生的事情。
我有这段错误代码
#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
开关)可能会显示更多关于发生的事情。