求助指標被free之後什麼時候是NULL 還是不可能是NULL

2022-06-09 15:46:33 字數 3165 閱讀 3868

1樓:匿名使用者

一個指標,除非本身等於null,否則free以後不會等於null。因為free不對指標的值做任何操作,而只是試圖改變指標指向的一片連續的儲存器空間的狀態。如果這片儲存器空間是malloc或其它相容方式(例如posix庫函式strdup)分配過來的,那麼會釋放這片空間,釋放的空間可以之後再次被分配。

如果指標本來就等於null,則呼叫free不會有任何作用。除以上兩種情況外(包括再次free已經被free過的非空指標),free的行為是未定義的,比較有可能的是free這個指標程序在某個時刻突然莫名其妙地崩潰。

int *p;

free(p);

這段**如果是連續的,只能在函式內出現,那麼int* p;是區域性自動變數,不會隱式初始化為0(null)。未初始化的變數的值是不確定的(一般運氣不會好到就是0;例如microsoft visual debugger會在debug模式下給未初始化的棧每個位元組填充0xcc,根本不可能是0),直接free的後果不可預料。

為了防止錯誤地free掉已經被釋放的指標,建議free某個指標之後立刻把這個指標賦值為null。

====

[原創回答團]

2樓:匿名使用者

free(p) 並不會對p本身的值做改變。所以p的值不變!

可能會改變p指向的那塊記憶體值。這個要看是什麼編譯器。

然而絕對會改變的就是 p所指向的那塊記憶體的狀態,free之前這塊記憶體是屬於本程序的,其他程序不可以合法訪問,作業系統也不會分配給其他程序或者執行緒。

free之後那塊記憶體就成為自由記憶體,可供作業系統分配任意程序。

所以被free之後的記憶體就不要訪問,否則可能會跟其他程序「打架」

3樓:陸成無敵

if (p=null)

試一試就知道了

c語言中free掉一段空間後為什麼還要使用null

4樓:風雷雪電

temp=null並不需要bai,它只是為了安全,避免du野指標。

如果你以zhi後還通過

daotemp指標訪問其版值,權如果沒有執行過temp=null;那麼程式很可能就默默地錯誤地執行下去了,是一種隱患;如果執行過temp=null;,程式一定會報一個錯誤,說指向0x00000000的記憶體不能為read。

5樓:王囧囧

free函式只是釋放掉

bai了du

指標所指向的那一zhi

段記憶體空間,但釋放後

dao指標本身的值內仍然保持,需要顯式的容置0。這麼做是有必要的,一般是結合**其它部分的引數檢查:當別處需要使用temp卻發現temp為null時,就會進行相應的處理(報錯或者malloc等等),而不會直接導致嚴重錯誤或者程式崩潰的出現。

6樓:滄海雄風

「野指標」不是null指標,是指向「垃圾」記憶體(不可用記憶體)的指標。人們一般不版

會錯用null指標,因為用if語句很容易

權判斷。但是「野指標」是很危險的,if無法判斷一個指標是正常指標還是「野指標」。有個良好的程式設計習慣是避免「野指標」的唯一方法。

指標p被free或者delete之後,沒有置為null,讓人誤以為p是個合法的指標。別看free和delete的名字(尤其是delete),它們只是把指標所指的記憶體給釋放掉,但並沒有把指標本身幹掉。此時指標指向的就是「垃圾」記憶體。

釋放後的指標應立即將指標置為null,防止產生「野指標」。

例:free( p );

if ( p != null )

p = null;

7樓:匿名使用者

萬一忘記了在這個地方已經free過temp了(當**很長並且比較複雜的時候極有可能),再一次free(temp)就會導致異常,而free(null)是不會有效果的……

結構體指標在使用完free後,該指標所指向的記憶體區域是什麼,這個指標是變成了null,還是野指標。

8樓:金色潛鳥

結構體指標在使用完free後,該指標所指向的記憶體區域還是原來的區域,除非該地區又被系統派別的用處。

_msize() 返回 動態分配的 實際 記憶體大小。

#include#include

#include

struct ss ;

int main()

for (i=0;i<3;i++) printf("%d ", s[i].x);for (i=0;i<3;i++) printf("%d ", s[i].y);

free(s); // 釋放for (i=0;i<3;i++) printf("%d ", s[i].x);

for (i=0;i<3;i++) printf("%d ", s[i].y);

return(0);

}輸出結果:

0 1 2 0 10 20

size=32

0 1 2 0 10 20

size=0

===釋放後,記憶體大小為0,但數值還在。

9樓:

不同的編譯器會有區別,例如keil在free後該片記憶體區域的資料還是原來的資料,不過系統知道,這篇記憶體是不用的記憶體,下次可能在分配記憶體的時候就會被佔用,有的編譯器則是直接清除free後的記憶體區域,變成null,或者一些看不懂的資料,但是總歸一點,這片記憶體已經可以被再次利用了。至於指標也是不同編譯器也會有所區別,如果不放心,還怕會變成野指標可以在free後,將該指標賦值為null。望採納

10樓:

free後,該指標指向的記憶體區域被系統**,但裡面內容還是釋放前的內容,只是被系統**後,有可能馬上又被其他地方申請出來使用,所以free後再去讀取這塊記憶體的內容就可能是不可預知的內容了。

free函式不會改變被釋放指標的值,也就是說free後該指標還指向被釋放的空間,一般需要特別對其賦值為null。

11樓:花花浪客

野指標,所以需要再手工把指標置零

簡單測試一下就能知道,看下面的程式與執行結果:

12樓:匿名使用者

幾年以後今天已經一體機

在指標中什麼時候p f是合法的

什麼時候都是合法的,不過型別不同的話就需要強制型別轉換 只能在申明一個指標型別變數的同時給它賦初值,這樣做才是合法的,不然的話就要寫成 p f ls錯誤。首先,f必需是左值表示式,否則 f這個表示式就是非法的。編譯錯誤的例子 char p p f 錯誤,f 不是一個左值,無法作為 的運算元。其次,p...

辟穀之後復食之後什麼時候可以繼續辟穀

辟穀三步曲是比較重要的,資訊輸入系統控制,辟穀過程,辟穀後復食,這個程式都非常重要。辟穀結束後,有些人覺得能量不足了,需要大吃大喝一則來滿足幾天未食的慾望,二來也犒勞自己的辟穀的辛苦,有的雖然辟穀堅持過來,馬上就去大吃大喝,結果造成了身體的傷害。辟穀之後,如果要復食瞭如果是胖人採用七天的流食,如果是...

被公司辭退應該什麼時候發工資

法律分析 離職當天可以結清工資,也可以在下個月發工資的時候一起發放。用人單位應在解除或終止勞動合同時一次付清勞動者工資。勞動者在試用期的工資不得低於勞動合同約定工資的百分之八十或者本單位相同崗位最低檔工資,並不得低於用人單位所在地的最低工資標準。法律依據 中華人民共和國勞動合同法 第三十條 用人單位...