2012-06-18 207 views
3

我很困惑我們如何能夠從函數返回字符串。從函數返回字符串c

char* someFunction() 
{ 
    return "Hello, World" 
} 

應該不是上述return語句拋出「函數返回局部變量的地址」和它是如何從功能不同:

char* newFunction() 
{ 
    char temp[] = "Hello, World"; 
    return temp; 
} 

這實際上也給出警告如上所述。

+1

你需要做的第一案'爲const char *'真的 – Flexo

+0

注意單詞「扔」往往指的是異常處理機制......這可能不是你的意思,因爲C沒有任何天生的支持。 – Kaganar

+2

有一個現有的[問題](http://stackoverflow.com/q/1704407/168175),涵蓋了兩種情況之間的關鍵區別。 – Flexo

回答

1

字符串文字具有靜態存儲持續時間。你可以返回一個指向字符串的指針,然後訪問該字符串,這是完全有效的和定義的行爲。

char* someFunction() 
{ 
    return "Hello, World" 
} 

在以下情況下,您將返回一個指向具有自動存儲持續時間的字符串的指針。自動存儲持續時間的對象在退出定義的塊後會被銷燬。所以在函數返回後訪問它是未定義的行爲。

char* newFunction() 
{ 
    char temp[] = "Hello, World"; 
    return temp; 
} 
5

在第一種情況下,字符串始終位於固定地址的常量只讀存儲器中。在第二種情況下,字符串放在本地堆棧上,所以是臨時的。

+0

我沒完全理解你說的。你是說,由於它是一個字符串常量,編譯器在編譯期間已經爲它分配了內存,因此不會引起任何問題。 – Pratt

+0

是的,編譯器是靜態分配一個固定的全球地址的字符串。我的意思與ouah所接受的答案一樣。 – TJD