2011年8月30日 星期二

The difference between char* and char[]

以下面的程式片段為例:
上面程式碼編譯執行結果會印出"string", 
但若把 method(2) 那行拿掉,只留 method(1) 那行,則編譯(g++)會有警告出現,
warning:address of local variable 'str' returned

揪竟~這兩種寫法差異為何?

在這個例子中:

[1]首先就宣告變數 str 來說,
method(1) 的變數 str 是配置在 local 區的記憶體中;
method(2) 的變數 str 也是配置在 local 區的記憶體中,但其指向的地方不是,而是在 constant pool (系統中放置常數資料的地方)。

[2]再者討論 return str; 的動作差異,
method(1) 會把陣列的記憶體位置回傳,回傳一個指向 local 區的記憶體位置,這是有風險的,因為當副程式 getStr() 完成後,其中所使用的變數 str 記憶體空間會被釋放,之後利用它的運算可能會出錯,所以編譯器會以警告告知你;
method(2) 則是回傳指標值,也就是 "string" 的所在記憶體位置,而這個值是指向非 local 區,所以是安全的動作。

說明
“xxxxxx” 常數 (literal constant string) 都是放在系統的 constant pool 中,而且通常 compiler 會將 constant pool 設為 read only。
char *ptr = “xxxxxx”; 是讓 ptr 指向 constant pool 裡第一個 ‘x’ 的位置。
char str[] = “xxxxxx”; 是在 stack 中開 7 個 bytes 的空間, 並將 ‘x’ ‘x’ ‘x’ ‘x’ ‘x’ ‘x’ + ‘\0’ 七個字元從 constant pool 中複製 (load) 過來。

0 意見: