char *pc = null;
pc = new char[0];
pc[0] = '1';
相信初學者看見上面這段**,都會覺得奇怪,new char[n]中的n指定給指標變數分配多少記憶體空間,而n=0時代表什麼呢?
其實上面的程式編譯、執行都是正確的。因為編譯器識別到指定大小為0時,會自動為其分配1byte的記憶體空間。
嘗試過的小夥伴會發現,給p[1]賦值也不會報錯,原因留到後面講*1。
但是,此時若想用delete p; 去釋放記憶體空間就會報錯,程式強制中斷,因為編譯器並沒有真正意義上內指標變數分配記憶體,去釋放肯定是不行的。
這就像對乙個成功分配記憶體的指標變數,連續釋放兩次造成的錯誤,例子見後面*2。
好了,馬上看一下成功分配記憶體的情況是怎麼樣的。
char *pc = null;
pc = new char[5];
pc[0] = '1';
這裡的n=5,意味著給指標變數分配5個byte記憶體空間(因型別為char),當然不管是什麼型別,指標變數本身均佔4byte。
這就是c/c++完美之餘的乙個歷史遺留缺陷,不進行越界檢查。
導致編譯沒有任何問題,執行階段有時一不小心也察覺不出,這就要求程式設計師養成良好的習慣:new後面必出現delete。
這就是上面遺留的第二個問題*2:對同乙個指標變數指向的記憶體釋放兩次,與釋放乙個沒有成功分配記憶體或引用越界的指標變數類似,都是不允許的。
仍可以賦值、取值進行運算,只是若沒有重新賦值,取出的值為不確定值,換句話說就是,p成了傳說中的野指標。
所以,這又是乙個要求養成良好習慣的地方,看文章開頭的地方,宣告乙個指標但未分配記憶體空間時,最好將其置為null。
這樣做有兩個好處:1、方便後面進行判斷,if(!p)表示無記憶體分配,若當初沒有將其置為null,則!p為真也代表不了什麼;
2、在delete後,重新分配記憶體之前,將其置回為null,避免其成為野指標。
而對於malloc與free,情況類似,有興趣的小夥伴可以嘗試下。
C C 指標 陣列和記憶體分配
指標表示的是變數的位址與值的關係 指標的定義 int p 指向整型變數的指標 struct point point p typedef int pint 使用pint代替int pint p,q 定義了兩個指向整型的指標變數p,q 指標變數指向變數的位址 1.指向變數的指標 int p p n 等同...
C C 記憶體分配
1 c c 記憶體分配 1 棧區 由編譯器自動分配和釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事。3 全域性 靜態 資料區 全域性變數和靜態變數的儲存是放在一塊...
C C 記憶體分配
記憶體分配方式 記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static 變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置...