char* pStr = new String("Hello");
char* s = "Hello";
第一個是否正確?這兩者有什麼區別嗎?我的猜測是,第一個是分配在堆上,另一個是堆棧。我糾正還是還有其他區別?指向字符的指針
char* pStr = new String("Hello");
char* s = "Hello";
第一個是否正確?這兩者有什麼區別嗎?我的猜測是,第一個是分配在堆上,另一個是堆棧。我糾正還是還有其他區別?指向字符的指針
第一個是錯誤的,不會編譯,因爲在C或C++中沒有String
這樣的東西。第二個會編譯,在C(afaik)中很好。但是,在C++中,從字符串文字到char*
的轉換已被棄用。你可以無意中寫下後面的s[0] = 'X';
這是未定義的行爲。
做它使用常量(在C++)
const char * s = "Hello";
,或者更好,使用串的正確的方法
std::string s("Hello");
PSTR和s是指針,所以這是要區分重要指針本身以及它們指向的數據。
在第一行,pStr是一個指向堆中分配的String類的實例的指針。該實例中的字符串數據是存儲在程序的data segment中的文本字符串「Hello」的副本。複製由String構造函數完成。 (你已經提到了一個String類,但我認爲你的意思是std :: string)。
在第二行,s是存儲在程序數據段中的數據的指針。數據段中的數據是不可變的,所以s應該是const char *。
在示例中沒有足夠的信息來判斷pStr和s是否存儲在堆或堆棧中。如果它們是函數內部的變量,那麼它們就在堆棧中。如果有一個類的成員,那麼如果該類是在幫助上實例化的(使用new),或者如果它被實例化爲值,則它們在堆上。
線
char* pStr = new std::string("Hello");
會導致編譯器語義錯誤,因爲LHS具有類型的char*
和RHS有一個類型的std::string
。
線
char* s = "Hello"
將編譯,但可以給予警告,因爲LHS的類型爲char*
和RHS的類型爲const char*
。
什麼是字符串? – 2011-02-24 10:25:10
如果您使用像'new'這樣的概念,'C'標籤應該被刪除。 – oosterwal 2011-02-24 12:38:24