今天看了《linux c程式設計王者歸來》動態記憶體管理一節。發現了乙個很容易犯錯的地方,特寫此部落格,以作總結。
結論:堆中的內存在釋放之前都可以被引用。堆中的記憶體雖然在釋放之前是一直可以引用的,但是指向該記憶體區域的指標卻是有生命期區別的。
正確的**如下:
#include
#include
void f1(int **p)
void f2(int *p)
int main(void)
錯誤的**如下:
#include
#include
void f1(int *p)
int main(void)
在linux系統和vs2017環境下分別除錯錯誤**。
linux:在gcc編譯時加入-wall選項,顯示乙個警告,f1中呼叫了未初始化的變數。忽略警告,執行可執行程式,會提示segmentation fault。原因是函式f1傳入的p是乙個值,而不是乙個引用。所以函式f1中對p的修改在函式返回的時候就消失了,不會被main()函式所察覺。在main()函式中p的指標仍然指向一塊未知區域。因此,在對p所指向的區域進行賦值時出現了段錯誤。
vs2017環境下預設開啟sdl檢查,所以ctrl+f7編譯時會彈出乙個錯誤,此時呼叫未初始化變數提示的是錯誤。
可見兩種環境下處理方式還是有區別的。
想到了c++中的引用的特性,將此**改為如下所示:
#include
#include
void f1(int * &p)
void f2(int *p)
int main(void)
由此想到c++的&引用可能就是由二級指標擴充套件來的。 二級指標動態記憶體分配
指標是可變陣列的首位址,正因為是可變陣列,所以一般使用指標都是採用動態記憶體分配和釋放的方式。一尾指標形式簡單,容易理解,平時應用較多 二維陣列和二維指標比較複雜,並且在動態記憶體分配與釋放方面比較複雜難以理解,但是二維陣列和二維指標是非常有用的 void func1 int p1,int p2 t...
堆區記憶體分配需要傳二級指標分配記憶體
如果主調函式中沒有給指標分配記憶體,被調函式用同級指標是無法更改主調函式的記憶體空間內容的。需要使用二級指標進行修改。測試原始碼 define crt secure no warnings include include includeint getspace for int i 0 i 5 i r...
多級指標的動態記憶體分配問題
先看例子 為乙個二級整形指標分配乙份可儲存 3 3 矩陣的記憶體。include include intmain 在使用 p i j 呼叫記憶體時,編譯器會顯示 取消對null指標p i 的呼叫 顯然,這個方式有問題。在這個例子中,物件為int型別,記憶體為 int 型別的數量分配,強制轉化型別為 ...