這個問題在這里已經有了答案: C - 在記憶體被釋放()之后訪問資料? (2 個回答) 21 小時前關閉。
在下面的代碼中,我釋放了指標ptr,但仍然*ptr回傳相同的值。如果我釋放變數,那么它應該給我一些垃圾值,但它沒有。
#include <stdio.h>
#include<stdlib.h>
int main()
{
int a=5;
int *ptr=&a;
printf("%d, %d \n",a,*ptr);
free(ptr);
printf("%d, %d \n",a,*ptr);
return 0;
}
uj5u.com熱心網友回復:
您只能使用free由malloc、calloc或realloc- 分配的記憶體來釋放與變數關聯的記憶體auto(行為未定義):
int *ptr = malloc( sizeof *ptr );
*ptr = 5;
printf( "%d\n", *ptr );
free( ptr );
uj5u.com熱心網友回復:
如果您沒有像 John Bode 回答的那樣自己分配記憶體,那么您就不能free這樣做。
但是,即使您確實分配了記憶體,free也不會擦除指標指向的記憶體塊的內容,它只是允許該記憶體塊被其他東西使用,因此它“釋放”它,而不是“擦除” . 如果在釋放記憶體塊后沒有其他任何事情發生寫入該記憶體塊,則您的內容仍將坐在那里。
uj5u.com熱心網友回復:
free(ptr)不改變 的值ptr。它僅僅要求記憶體管理軟體釋放所ptr指向的記憶體的保留。呼叫函式傳遞其引數的值;它不傳遞有關其引數身份的任何資訊,因此free不接收有關ptr允許free更改該變數的變數的任何資訊。它只接收其值的副本。
此外,只有在傳遞先前由或相關例程free回傳的地址時才定義的行為。malloc當給定一個命名物件的地址時,它沒有被定義,例如&a.
uj5u.com熱心網友回復:
兩件事情:
首先:ptr包含的值不是分配的記憶體malloc。
對于每一個malloc,必須有一個free。由于您正在free()使用未分配的記憶體malloc,因此您正在呼叫未定義行為(C 和 C 程式員喜歡這個術語)
第二:由于您正在呼叫Undefined Behavior,因此行為可以是任何東西。一個看似正確的行為程式可能處于未定義行為的領域。你只是幸運地一次又一次地收到相同的價值。在其他系統上,您的程式可能會崩潰、殺死無辜的奶奶或只是按下宇宙的洗掉按鈕。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/427881.html
