我有這段錯誤的代碼
#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
錯誤。但是當洗掉arr
在 main 中宣告的行時,我沒有看到任何錯誤,我也不明白為什么。在這兩種情況下,我都釋放了一個野指標,那么為什么前者會顯示錯誤?我正在使用 onlinegdb 的 C 編譯器(它是 gcc afaik)。
uj5u.com熱心網友回復:
“野指標”不是一個東西。也就是說,不存在具有野生屬性的指標。
當free(count)
被呼叫時,由于關于使用未初始化的自動物件的特殊規則,C 標準沒有定義該行為。但是,如果 C 實作確實呼叫free
此代碼,它會為引數傳遞一些值。
如果有人說這是一個“狂野”的值,他們并不意味著傳遞了任何特定的值或任何特定型別的值。他們的意思是價值不受控制。因為它不受控制,它可能是零,它可能是 的地址arr
,它可能是堆疊上某個東西的地址,它可能是 的地址main
,它可能是什么都沒有的地址,它可能是一個根本不是有效地址的值。
在您嘗試的任何實驗中,當int arr
宣告存在時,一些值被傳遞給free
導致您看到的錯誤訊息。并且當宣告不存在時,傳遞了一些其他值free
不會導致錯誤訊息。傳遞的那個值可能只是在執行之前的程式初始化之后發生在堆疊或程式暫存器中的偶然事件main
。洗掉宣告可能偶然改變了留在記憶體或暫存器中的內容,或者可能改變了編譯器在count
呼叫時使用的記憶體或暫存器free
。
要求編譯器顯示兩個程式的匯編代碼(使用 GCC 的-S
開關)可能會顯示更多關于發生的事情。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/469334.html
上一篇:這個Cfor回圈的終止條件是什么