2012-04-02 32 views
4
char* stringReturn() 
{ 
char a[] = "Array of characters"; 
//return a; // I know stack allocation should not be returned 

char *b = "Pointer to a string"; 
return b; // Is it safe ? 
} 


int main() {  
    char *str = stringReturn(); 
    cout<< str; 
    return 0; } 

這是安全的意思,那麼數據「指向字符串的指針」將存儲在內存中。將指向字符串的指針返回給調用者是否安全?

+1

可能的重複[http://stackoverflow.com/questions/2327841/c-string-literal-data-type-storage](http://stackoverflow.com/questions/2327841/c-string-literal-數據類型存儲) – jrok 2012-04-02 17:39:06

+0

另請參閱:http://stackoverflow.com/questions/349025/is-a-string-literal-in-c-created-in-static-memory – 2012-04-02 17:39:28

+5

請注意,實際上,您正在編寫C代碼,不用介意'std :: cout'。這有缺點。其中之一是字符串處理相當複雜和危險。 (對於初學者'b'應該是一個'const char *';嘗試修改它的調用者將炸燬地球,返回'a'也是一個災難,並且返回一個動態分配的字符數組成爲維護噩夢。你有沒有考慮過使用'std :: string'?這樣做,這些問題就會消失。 – sbi 2012-04-02 17:46:01

回答

9

是的,返回b的值是安全的。 b點的字符串文字具有靜態存儲持續時間。

但是,您必須正確地聲明指針constb必須是const char*b

5

變量聲明的char[]char*之間有區別。當你在代碼中的註釋指出,char a[]分配爲a棧上的內存和copyies的字符數組,從根本上讓相同的聲明:

char a[] = {'A', 'r', 'r', 'a', 'y', ' ', 'o', 'f', ..., '\0'}; 

當函數退出時,內存分配在數組的棧上消失了,不再通過指針指向它是安全的。

當通過char* b對變量進行分類時,靜態分配的char數組的地址存儲在指針b的存儲器中。分配字符串的實際內存不是由標準規定的,而是在整個代碼執行過程中都可以訪問(事實上,如果你用另一個變量char*聲明瞭完全相同的字符串,編譯器可能會重用該內存) - 所以傳遞該地址是安全的(例如,作爲函數的返回值)。

正如Rob指出的那樣,您應該聲明指針const char*的類型,以避免意外地嘗試寫入存儲字符串的內存:標準不保證已將其放置在字符串的可寫段中記憶。如果您需要更改它,則需要動態分配內存,將該字符串複製到分配的內存中,然後返回/使用該內存。