2016-02-03 46 views
1

字符串聲明工程時,我宣佈在以下方面:字符串宣言

string a = "xyz"; 
char a[] = "xyz"; 

但在以下情況下:

char *a = "xyz"; 

它使在G ++ 4.9.2編譯器的錯誤:

警告:不推薦將字符串常量轉換爲'char *' [-Wwrite-strings] char * a =「xyz」;

我認爲這三種聲明類型是互不相同的。請幫助我。

+0

這是一個警告,而不是一個錯誤。 「警告」一詞就是線索。 –

回答

2
string a = "xyz"; 

這使用初始化語法來調用構造函數std::string(const char*)

char a[] = "xyz"; 

這聲明瞭一個足夠大的數組來存儲字符串加終止符。它遵循標準的數組初始化規則。把它看成是相當於char a[] = { 'x', 'y', 'z', '\0' };

char *a = "xyz"; 

這需要一個字符串("xyz")並將其分配給一個非恆定指針。在該語言中,這樣的指針意味着可以修改它指向的字符串,但在這種情況下,這是未定義的行爲,因爲可能不會修改字符串文字。爲了防止你犯這樣的錯誤,編譯器會給你一個警告。以下是有效的,並且不會發出警告:

const char *a = "xyz"; 
2

在語言的早期版本(S),你可以使用:

char* a = "xyz"; 

現在,你必須使用:

char const* a = "xyz"; 

一個字符串文字,如"xyz"駐留在程序的唯一部分。它可以用來初始化char const*,因爲您不應該修改char const*指向的內容。用它初始化一個char*會打開用戶意外修改它們的可能性。另外,修改這樣的字符串會導致未定義的行爲。

字符串文字也可用於初始化char[]。在這種情況下,字符串文字被複制到爲數組分配的空間。因此,修改程序的只讀數據沒有風險。因此,使用

char a[] = "xyz"; 

是好的。

string a = "xyz"; 

調用的string採用一個char const*,然後使用該對象來初始化a構造。因此,該行也是可以的。

+1

我不明白爲什麼這個答案是downvoted。它很清楚,正確,甚至提供了一些歷史。 – paddy

+0

@paddy,我既不。希望他們會解釋它:) –

+0

RSahu和@paddy你的答案都能幫助我理解這個問題。謝謝你的回覆。 :) – biswasJUCSE