字符串聲明工程時,我宣佈在以下方面:字符串宣言
string a = "xyz";
char a[] = "xyz";
但在以下情況下:
char *a = "xyz";
它使在G ++ 4.9.2編譯器的錯誤:
警告:不推薦將字符串常量轉換爲'char *' [-Wwrite-strings] char * a =「xyz」;
我認爲這三種聲明類型是互不相同的。請幫助我。
字符串聲明工程時,我宣佈在以下方面:字符串宣言
string a = "xyz";
char a[] = "xyz";
但在以下情況下:
char *a = "xyz";
它使在G ++ 4.9.2編譯器的錯誤:
警告:不推薦將字符串常量轉換爲'char *' [-Wwrite-strings] char * a =「xyz」;
我認爲這三種聲明類型是互不相同的。請幫助我。
string a = "xyz";
這使用初始化語法來調用構造函數std::string(const char*)
。
char a[] = "xyz";
這聲明瞭一個足夠大的數組來存儲字符串加終止符。它遵循標準的數組初始化規則。把它看成是相當於char a[] = { 'x', 'y', 'z', '\0' };
char *a = "xyz";
這需要一個字符串("xyz"
)並將其分配給一個非恆定指針。在該語言中,這樣的指針意味着可以修改它指向的字符串,但在這種情況下,這是未定義的行爲,因爲可能不會修改字符串文字。爲了防止你犯這樣的錯誤,編譯器會給你一個警告。以下是有效的,並且不會發出警告:
const char *a = "xyz";
在語言的早期版本(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
構造。因此,該行也是可以的。
我不明白爲什麼這個答案是downvoted。它很清楚,正確,甚至提供了一些歷史。 – paddy
@paddy,我既不。希望他們會解釋它:) –
RSahu和@paddy你的答案都能幫助我理解這個問題。謝謝你的回覆。 :) – biswasJUCSE
這是一個警告,而不是一個錯誤。 「警告」一詞就是線索。 –