[英]in c++ is this a good practice to initialize char array with string literal?
在 C++ 中,這是用字符串初始化字符數組的好習慣嗎? 如:
char* abc = (char *) ("abcabc");
我在同事的代碼中看到了很多這些。 我應該將其更改為正確的做法嗎? 如
std::string abc_str = "abcabc";
const char* abc= abc_str .c_str();
這個說法
char* abc = (char *) ("abcabc");
簡直糟糕透了。 C++ 中的字符串文字具有常量字符數組的類型。 所以一個有效的聲明看起來像
const char *abc = "abcabc";
注意:在 C 中你確實可以寫
char *abc = "abcabc";
盡管如此,字符串文字是不可變的。 任何修改字符串文字的嘗試都會導致未定義的行為。
順便說一句,沒有任何由字符串文字初始化的字符數組。:) 也許您的意思是以下內容
char abc[] = "abcabc";
使用標准類std::string
不排除使用字符數組以及指向字符串文字的指針。
考慮到這些聲明
const char *abc = "abcabc";
和
std::string abc_str = "abcabc";
const char* abc= abc_str .c_str();
不等價。 相對於第一個聲明字符串文字具有靜態存儲持續時間,並且它們的地址在程序執行期間不會改變。 在第二個聲明中,指針abc
指向動態分配的內存,如果對象abc_str
將被更改,則可以重新分配該內存。 在這種情況下,指針將無效。
此外,第一個聲明假設指針指向的數組(字符串文字)不會改變。 在第二個聲明中,假設 std::string 類型的對象將被更改。 否則,聲明一個 std::string 類型的對象而不是指針是沒有意義的。
因此,聲明的含義完全不同。
char* abc = (char *) ("abcabc");
那很不好。 不要這樣做。
您正在處理不應像可以修改那樣修改的字符串文字。
在那之后,
abc[0] = 'd';
編譯器可以,但在運行時不行。 您需要使用的是:
char abc[] = "abcabc";
這將創建一個可修改的數組。
這兩個都不好。
char* abc = (char*) ("abcabc");
字符串文字是一個常量,因此可以存儲在寫保護的內存中。 因此寫入它會使您的程序崩潰,這是未定義的行為。
而不是丟掉常量性,你應該保持const
,然后復印一份,如果你想修改其內容。
const char* abc = "abcabc";
另一個也應該避免:
std::string abc_str = "abcabc";
const char* abc = abc_str.c_str();
保持常量是好的,但如果字符串被更改,它可能會重新分配到內存中的另一個位置,從而使您的指針懸空。
同樣在C++11
代碼中,指針在第二次被分配時停止有效,因為不能保證它不是臨時的。
最好每次都調用abc_str.c_str()
。
很有可能因為c_str()
是一個微不足道的操作,它會被編譯器優化掉,使其與使用原始指針一樣有效。
你應該做的不是這兩個,而是一直使用std::string
。 如果您絕對需要一個const char*
(對於舊的遺留代碼),您可以使用c_str()
獲得它。
std::string abc_str = "abcabc"; // this is perfect why do more?
old_horrible_function(abc_str.c_str()); // only when needed
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.