指針賦值爲NULL;是什麼意思呢?



int *p=NULL;這個NULL是什麼意思?

    網上百度了下,有人說NULL=0;是在頭文件中定義的;

    首先要說的是:非堆分配的內存是不需要free的。
    再說p=NULL;指針的變化是 p指向了一個地址爲0的內存,這就提醒別人不要對這個指針進行解引用的操作。NULL其實就是0x0。p=NULL後,p指向0x0這個地址。此處的地址,你沒有訪問權限。

     空指針指沒有定位內存的指針,值爲null(0),你使用new或者malloc申請了指針p,使用後delete或者free,你必須將指針值設置爲null,否則,p將成爲一個非法指針,後續代碼如果使用到該指針有可能會造成系統崩潰(內存不可以讀不可寫),或者,破壞自身有效內存數據(釋放後,又在申請作爲別的用途,恰巧系統分配了同一塊內存)

     free(p)是隻是將malloc申請的內存空間釋放,在不改變free()函數的原型前提下是無法做到P=NULL的,P=NULL相當於空指針,不指向任何有效的對象。絕對不允許間接使用空指針,否則程序會得到毫無用處的結果或者全部是零的值,或者會突然停止。P=null,之後,p還是原來的類型的,不變的。


    比如說 我定義了一個整形變量 int a = 1;  同時定義了一個指針p指向這個變量a: int  *p = &a;
但我用完這個變量和指針的時候我把指針所指向的內存空間釋放掉:free(p);這個時候p所指向的內存空間裏面的數據1被清空的,但是指針p裏面仍然存有一個地址(原來指向a變量內存空間的地址),此時通常再要把指針p設置成空指針:P = NULL。我的問題來了:從free(p);這條語句到p = NULL;這條語句,指針p的狀態發生了哪些變化,到底什麼樣的指針才叫空指針?是不是P = NULL;之後,p裏面所存放的地址就爲空了?是這樣理解嗎?此時p還有指向的數據類型嗎?比如說p還是一個int *型的指針嗎?
 還有通常用if (p != NULL)來預防錯誤,就是說如果當指針p爲空指針的時候,這個指針就最好不要用,要不然可能會發生內存泄露、空指針一場等錯誤,爲什麼呢?

1. int *p = &a; 這樣的指針不可用 free , free 只是針對 malloc, realloc 的內存進行釋放。
2. 空指針是指指針指向地址0,如果是你分配的內存,並且使用 free 釋放,然後把指針置成 0 ,只是爲了不進行非法的引用。

char* tmp = (char*)malloc(1024);
free(tmp);
tmp = 0;

在 free 後,如果後面再引用 tmp, 因爲是個空指針,會導致進行崩潰。
如果不置爲0,比如
char* tmp = (char*)malloc(1024);
free(tmp);
char* tmp2 = (char*)malloc(1024);
memset(tmp, 0, 1024);
這樣,由於堆管理特性,很可能 memset(tmp, 0, 1024)寫了 tmp2 指向的空間。
這樣,釋放完 tmp 後,再使用它,謂之野指針。
使用野指針會造成不可預期的後果,而使用空指針會造成比較確定的後果:崩潰。
所以 釋放完後給指針賦成空,很大程度是避免以後錯誤地使用指針。


free(p)//報告系統,我要釋放內存,系統就將該內存塊標記爲未使用,但不影響p的值
p = NULL//free被執行後,你需要將該指針標記爲空,因爲p指向的內存以被系統收回,不屬於你的程序
這兩個語句一般是在一起使用的

總結:爲了避免野指針,定義指針的時候必須給指針初始化(以防指針空間的數據沒有及時清空),用free(P)釋放掉指針所指的內存空間後,必須立即同時把p賦值爲NULL,避免後面程序指針P而導致意想不到的錯誤,甚至系統崩潰!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章