2010-08-24 85 views
0

你能做到這一點嗎?返回字符*到字符串

char* func() 
{ 
    char * c = "String"; 
    return c; 
} 

這裏「String」是編譯器全局分配的數據嗎?

回答

6

你可以這樣做。但它會更加正確地說:

const char* func(){ 
    return "String"; 
} 

C++規範說,字符串文字被賦予靜態存儲持續時間。我無法鏈接到它,因爲有幾個版本的C++規範在線。 const correctness上的這個頁面是我能找到的最佳參考。

科的ISO/IEC 14882 2.13.4(編程語言 - C++)表示:

  1. 字符串文字是由雙引號所包圍,任選的字符序列(如在2.13.2中定義的) 以字母「L」開頭,如「...」或L「...」。不以L開頭的字符串文字是普通的 字符串文字,也被稱爲窄字符串文字。一個普通的字符串文字的類型爲「數組n」,其中n是下面定義的字符串的大小,並且是用給定字符初始化的 。 ...

  2. 是否所有字符串文字都是不同的(即,存儲在非重疊對象中)是實現定義的。 嘗試修改字符串文字的效果未定義。

+0

你的意思是2.13.4/1。雖然我不能編輯它! – Chubsdad 2010-08-24 13:57:25

0

常量不是分配在堆上,而是常量。你不需要銷燬它。

0

不在現代編譯器中。在現代編譯器中,"String"的類型爲const char *,由於const不匹配,您無法將其分配給char *

如果您製作c a const char *(並更改函數的返回類型),則代碼將是合法的。通常,字符串文字"String"將被鏈接器放置在可執行文件的數據部分中,並且在很多情況下,將放在只讀數據的特殊部分。

+1

除C++中有一個特定的規則允許這種隱式轉換以便與C代碼向後兼容。雖然我不能說C++ 0x。 – 2010-08-24 13:36:58

+0

而且沒有理由爲什麼編譯器不能在.text段中放置「String」。 – doron 2010-08-24 13:45:43

1

你可以做到這一點目前(雖然沒有理由)。但是你不能用C++ 0x來做這件事。他們刪除了字符串文字(類型爲const char[N])的棄用轉換爲char *

請注意,對於字符串文字,此轉換僅爲。因此,以下兩件事是非法的,其中第一個指定的陣列,並且其中第二個指定的指針進行初始化

char *x = (0 ? "123" : "345"); // illegal: const char[N] -> char* 
char *x = +"123"; // illegal: const char * -> char* 

GCC不正確,可同時接收,鏘正確地拒絕兩者。