簡體   English   中英

是否適合在函數參數中將字符串文字轉換為char *?

[英]Appropriate to cast string literal to char * in function argument?

我有一個接收char *參數的函數:

Foo::Foo (char * arg0) {
    ....
}

在原始示例中,使用char[]傳遞此值...

char bar[] = "Bar";
Instance.foo (bar);

...效果很好。

但是,我發現我可以傳遞一個字符串文字,將其轉換為char * ,而無需編譯器的任何警告。

Instance.Foo ((char *) "Bar");

但是,從我的閱讀來看,似乎應該避免-指向的內存值可能會更改。

上面的說法是正確的(“應該避免”)還是在這種情況下合適?


編輯-進一步的研究發現這篇文章很好地解決了我的問題...

是的,避免那樣。 現在,如果您的函數采用了const char * ,則使用字符串文字調用它沒有任何問題。

C ++編譯器僅出於向后兼容的原因而支持從字符串到char *char * ,並且寫入字符串文字會導致未定義的行為。

當你做char bar[] = "Bar"; 您執行的操作與執行char bar* = "Bar";時的操作根本不同(即,使用可以自由修改的值{'B', 'a', 'r', '\\0'}初始化4個字符的數組) char bar* = "Bar"; (正在創建指向您無法修改的4字節字符串的非const指針)。

在我看來,你永遠不應該把字符串字面直接進入char* ,而不是把它變成一個const char*然后(如果您使用的是傳統的API通信)明確const_cast<char*>const內斯路程,評論表示您正在使用的傳統API保證不會更改char 這樣做的好處是,您可以在升級API時在程序中搜索那些const_cast ,或者您想查找涉及寫入char*的分段錯誤的來源。

甚至可以用const char*版本包裝舊版API,並在其中進行const_cast

絕對最糟糕的情況是有一堆char* ,其中有些可寫,而另一些則來自字符串文字。

應該避免幾乎所有的代價,只有在必須與損壞的舊版API交互時,並且僅在查看了它們的源代碼並確保它們未寫入字符串時,才應避免這樣做。

保持安全,在傳遞字符串之前,先使用strcpy復制該字符串。

到底是什么邪惡? 寫入字符串文字是未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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