簡體   English   中英

在 C++ 中,這是用字符串文字初始化 char 數組的好習慣嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM