char陣列和char指標應該注意的

2021-08-07 15:56:12 字數 2113 閱讀 7070

陣列要麼在靜態區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其位址與容量在生命週期內保持不變,只有陣列的內容可以改變。

指標可以隨時指向其他型別的記憶體塊,它的特徵是「可變」,所以常用指標來操縱動態記憶體。指標遠比陣列靈活,但也更危險。

1.返回指向棧上的記憶體的指標

char * teststr1()

void main()

//類 complex

//2.返回類(棧記憶體)

complex fun2()

1)對於返回int型的棧上記憶體的解釋:return返回值的機制為:將返回值存入eax暫存器中,然後系統再將eax中的值賦給變數(i)。

2)對於返回值是類型別的解釋:返回值是物件時會呼叫拷貝建構函式。因為返回的區域性變數在函式結束時已被銷毀,所以編譯器都會先建立乙個此物件的臨時拷貝,而在建立該臨時拷貝時就會呼叫類的拷貝建構函式。

3)對於返回指向棧儲存的「指標」的解釋:

在執行return語句時,首先將return後面的位址值返回存入到比如eax暫存器中,然後系統再將eax中的位址值給接收函式返回位址的指標變數。這看起來都沒什麼問題,但問題在於兩個方面:

[1]接收函式返回位址值的指標變數要訪問此位址中的內容。

[2]子函式執行結束後,一切有關於區域性變數的記憶體都已經釋放**。那麼在用這個位址來操作就很危險:位址中沒有內容

總結:(1)return

不管是返回指標還是返回值,return將return之後的值存到eax暫存器中,回到父函式再將返回的值賦給變數。

(2)區域性位址

在函式內返回乙個指標會出錯的原因:子函式執行完畢時,存區域性變數的所有棧位址的內容已經被釋放。若在父函式中再訪問這些位址中的內容時,因為這些位址的內容已經被釋放,所訪問到的值可能是亂的、不定的。

參考:1) return機制

2) c/c++return如何實現的?return的內部機制

2.返回靜態記憶體

char * teststr2()

void main()

有問題,value2是空指標,沒有分配記憶體。

4.引數為指標時,形參指向靜態記憶體或者另一位址,實參實際上無任何變化

buf依然是空的,因為引數傳遞相當於是char *value = buf,value指向buf

而value = "hello",相當於是value指標指向了hello所在的靜態記憶體,但是buf的內容沒變

void teststr4(char * value)

void main();

teststr4(buf);

}

5.buf最後是hello,引數傳遞,此時,value 和buf指向的是同一塊記憶體,strcpy是將value1中的內容複製到value所指的記憶體中

返回時由於value和bufs還是指向同一塊記憶體的,所以bufs的內容為hello.

void teststr5(char *value)

void main();

teststr4(buf);

}

4和5要對比著看

6.如果函式的引數是乙個指標,不要指望該指標去申請動態記憶體

void teststr6(char *p, int num)

void main()

結合著4和3看。只是把p的記憶體位址變了,str絲毫未變。且每呼叫一次就會造成一次記憶體洩露,因為沒有呼叫free釋放記憶體。

如果非要用指標引數去申請記憶體,那麼久應該該用「指向指標的指標」

void teststr7(char **p, int num)

void main()

void main(){

char *str = null;

str = teststr8(100)

strcpy(str, "hello");

cout《用函式返回值來傳遞動態記憶體的方法需要特別注意一點,不要用return語句返回指向「棧記憶體」的指標,因為該內存在函式結束時自動消亡。(參考1)

char陣列和char指標

在c c 中,指標和陣列在很多地方可以互換使用,這使得我們產生一種錯覺,感覺陣列和指標兩者是完全等價的,事實上陣列和指標是有很大的區別的。1.兩者在含義上的區別。陣列對應著一塊記憶體區域,而指標是指向一塊記憶體區域。其位址和容量在生命期裡不會改變,只有陣列的內容可以改變 而指標卻不同,它指向的記憶體...

char陣列與char指標

1 以字串形式出現的,編譯器會在結尾自動新增 0,思考,為什麼?存在的c語言方法,如strlen s 計算字串的長度,其中s指標。strlen要計算字串長度,必須知道 是結尾,因此使用 0表示結尾。只有字元陣列才有 0的概念,其它型別 int 的陣列沒有這個概念。因為其他型別的陣列或者指標,沒有st...

char陣列與char指標

char陣列與char指標 1 以字串形式出現的,編譯器會在結尾自動新增 0,思考,為什麼?存在的c語言方法,如strlen s 計算字串的長度,其中s指標。strlen要計算字串長度,必須知道 是結尾,因此使用 0表示結尾。只有字元陣列才有 0的概念,其它型別 int 的陣列沒有這個概念。因為其他...