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