指標經常容易犯的錯誤

2021-05-25 02:53:26 字數 1365 閱讀 6639

以下內容摘自林銳博士的《高質量的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 以上是之前的錯誤,找了好半天,也一直沒有發現,從頭到尾推...