以下內容摘自林銳博士的《高質量的c-c++程式設計》。雖然網上對這本書(文章?)的評價不高,但是個人覺得,記憶體管理這章還是有些地方可以借鑑的。因此,摘錄這些內容算是乙個複習和總結吧!
1指標與陣列的對比
1.1修改內容
char a = "hello";
a[0] = 『x』; //ok
char *p = "hello";
p[0] = 'x'; //error
指標p是指向常量字串(位於靜態儲存區)。但是常量字串的內容是不能改變的。所以當試圖通過p[0]去改變時,會出錯。並且編譯的時候是沒法發現該問題的。
1.2計算內容儲存量
char a = "hello world"; //sizeof(a) = 12
char *p = a; // sizeof(p) = 4
void func(char a[100])
//sizeof (a)= 4
注意sizeof(p)得到的是乙個指標變數的位元組數。相當於sizeof(char *),而不是p所指向的記憶體的容量。c++是沒有辦法知道指標所指向記憶體的容量的,除非在申請的時候記住。
另外陣列作為函式引數時,自動退化為同型別指標。
2.指標引數傳遞記憶體
void getmemory(char *p, int size)
p = (char*)malloc(sizeof(char)*size);
void test()
char *str =null;
getmemory(str, 100); //str仍然是null
strcpy(str, "hello");//錯誤
編譯器總是會為函式的每個引數製作乙個臨時副本。指標引數p的副本是_p。編譯器使_p=p。
如果函式內改變了_p所指向記憶體的內容。則p的內容也改變。這就是指標可以用作輸出引數的原因。
但是本例中,為_p申請了新的記憶體。改變的只是_p的值,但是p未變化。所以呼叫getmemory(...)之後,
str仍然是null。
可以通過如下方法改變記憶體。
char* getmemroy(int size)
char *p= null;
p = (char*)malloc(sizeof(char)*size);
return p;
用函式返回值來傳遞動態記憶體這種方法雖然不錯,但是要避免返回棧指標--函式結束的時候,棧記憶體自動銷毀。
char *getstring()
char p = "hello world";
return p;
void test()
char *str = null;
str = getstring(); //str的內容不確定
引用容易犯的錯誤。
由於物件a是個區域性物件,因此當函式物件func結束後,區域性物件a也就被刪除了。由於物件a消失了,所以func 函式返回的其實是乙個並不存在的物件的別名。用這個不存在的物件來呼叫該物件的函式get 該函式會返回乙個並不存在的物件的x成員。因此輸出乙個隨機數。如果這樣,那輸出就是23,為什麼?因為去...
python中容易犯的錯誤
python寫 時,在條件語句中老是忘記加判斷導致出錯。1 對於鍊錶 樹的資料結構,當node不為none,假如要訪問node.next.next時,經常就直接寫node.next.next 或node.left.left 導致程式經常報錯 nonetype object has no attrib...
!!!!新手最容易犯的錯誤
今天寫了乙個很簡單的程式,輸入三個不同長度的字串,然後將其右對齊顯示 因為剛學了幾天,經常會犯一些錯誤,如下 file day01.py line 62 print maxn len b b syntaerror invalid syntax 以上是之前的錯誤,找了好半天,也一直沒有發現,從頭到尾推...