陣列要麼在靜態區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其位址與容量在生命週期內保持不變,只有陣列的內容可以改變。
指標可以隨時指向其他型別的記憶體塊,它的特徵是「可變」,所以常用指標來操縱動態記憶體。指標遠比陣列靈活,但也更危險。
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 的陣列沒有這個概念。因為其他...