2011-12-15 22 views
5

考慮下面的代碼:Ç - 返回一個字符指針沒有的malloc

char* pointerTesting(void) { 

    char* test = "hello"; 
    return test; 
} 

int main() { 

    char* string = pointerTesting(); 
    printf("string: %s\n", string); 
} 

這有沒有問題編譯和運行。但是,在我的理解中,這不應該起作用,因爲分配給test指針的內存在堆棧上,並且在返回到main時被破壞。

所以問題是,這是如何管理沒有malloc在pointerTesting()函數?

+3

請參閱http://stackoverflow.com/questions/2589949/c-string-literals-where-do-they-go以及關於此主題在stackoverflow上的一堆類似問題。 – jman

+0

*指針*在堆棧上分配(對於典型實現),但不返回指針,只有其值爲副本。它類似於'int n = 42;返回n;'。這就是它指向相關的分配。 –

回答

13

在這種情況下,字符串"hello"存儲在全局內存*中。所以它的已經分配了

因此,從函數返回時它仍然有效。

但是,如果你這樣做:

char test[] = "hello"; 
return test; 

然後不,這是行不通的。 (未定義的行爲)在這種情況下,字符串實際上是一個本地數組 - 當函數返回時該字符串不再有效。

*雖然通常情況下,標準並沒有說它必須存儲在全局內存中。
但重要的部分是字符串文字的生命週期是整個程序的持續時間。 (見評論)

+0

如果你的回答提到''hello''在全局內存中是由於執行事故,而不是由於任何標準中的被禁行爲,我會更高興。 – sarnold

+0

@sarnold同意,我應該把它改爲「*通常*存儲在全局內存中」嗎?或者我應該說「存儲在別處*」? – Mysticial

+0

我喜歡你現在擁有的星號。 :) 謝謝! – sarnold

5

您傳回價值test,這是字符串中的第一個字符的文字"hello"(其中,像所有的字符串常量,存儲爲char陣列以這樣的方式,它的可用地址爲節目的生命週期)。如果你試圖返回地址test供以後使用,那麼是的,你會遇到問題。

現在下面的代碼片段會工作:

char *pointerTesting(void) 
{ 
    char test[] = "hello"; 
    return test; 
} 

在這種情況下,你想返回是本地函數在數組對象中的第一個元素的地址,這將一旦函數退出,就無效。請記住,在大多數情況下,類型「T元素的N元素數組」的表達式將替換爲「指向T的指針」類型的表達式,其值是數組中第一個元素的地址。