2010-06-15 54 views
5
char *myfunc() { 
    char *temp = "string"; 
    return temp; 
} 

在這段代碼中,temp指向的對象的分配發生在哪裏,它的範圍是什麼?C++中的對象分配

此函數是返回char *指針的有效方法嗎?

+2

這功課嗎? – 2010-06-15 17:40:36

+1

@Dirk Eddelbuettel:沒有。 – Moeb 2010-06-15 17:41:34

回答

13

代碼是否正確?

是的,你的代碼是(幾乎)很好,因爲"string"是一個字符串文字,位於靜態存儲中。

注意:指針只是一個存儲內存地址的變量。該行只是將字符串文字「字符串」的地址存儲在名爲temp的變量中。

char *temp = "string"; 

C++標準保證字符串文字將在程序的持續時間內保留下來,如下定義。這意味着您可以在程序的整個生命週期的任何地方隨意使用該內存地址。


爲什麼?

的C++ 03標準(電流)具有這樣說的:

一個普通的字符串文字的類型是 「的n個常量字符陣列」和靜態 存儲持續時間(3.7),

和第3.7.1節 - 1:

所有對象既不具有動態 存儲持續時間也不是本地有 靜態存儲時間。這些對象的存儲 應該持續該程序的持續時間 。


警告:

在你的代碼是返回char*,你真的應該返回const char *。如果你試圖修改一個字符串文字,這是未定義的行爲,你的函數返回值不應該假裝允許它。

在警告的相關方面注意。如果您在兩個不同位置的代碼中有一個名爲"string"的字符串,那麼它們是否是不同的字符串是實現定義的。

+0

感謝Brian! – Moeb 2010-06-21 02:45:03

6

這段代碼的工作原理是正確的,因爲對象「string」是靜態數據,在編譯過程中「分配」(可以這麼說) - 鏈接器將它放在可執行文件的特殊部分。

但是,當引用靜態數據時,符合標準的C++應該說const char*而不是char*

+0

這不是標準的要求。 Poiuyt的代碼完全合法。這是一個更好/實踐/使用char const *而不是char *,但標準並不要求它。 – 2010-06-15 17:55:52

+2

@Noah:如果你修改這個字符串,它是未定義的行爲。 – 2010-06-15 18:03:13

+0

@EFraim,@Brian R. Bondy,@Noah Roberts:爲什麼字符串不是'myfunc()'本地的? – Moeb 2010-06-15 18:11:12

3

如前所述,它是在編譯時分配的;這是一個文字。

但是在C++中它的不是,因爲它可能是有效的,因爲指針不指向const char。總的來說,你應該考慮以一種完全不同的方式來做這件事。

+0

+1指出'const'問題。 – Void 2010-06-15 20:17:07