Ben*_*Ben 3 c++ pointers function char
我有一个接收char *参数的函数:
Foo::Foo (char * arg0) {
....
}
Run Code Online (Sandbox Code Playgroud)
在原始示例中,a char[]用于传递此值...
char bar[] = "Bar";
Instance.foo (bar);
Run Code Online (Sandbox Code Playgroud)
......工作正常.
但是,我发现我可以传递一个字符串文字,作为一个char *,而没有来自编译器的任何警告.
Instance.Foo ((char *) "Bar");
Run Code Online (Sandbox Code Playgroud)
但是,从我的阅读中,似乎应该避免 - 指向的内存值可能会改变.
以上陈述是否属实("应该避免这种情况")或在这种情况下是否合适?
编辑 - 进一步研究发现这篇文章很好地解决了我的问题......
Yak*_*ont 10
是的,避免这样做.现在,如果您的函数const char *采用了字符串文字调用它没有任何问题.
C++编译器仅支持string-literal,char *仅用于向后兼容,而写入字符串文字会导致未定义的行为.
当你这样做时,char bar[] = "Bar";你正在做一些根本不同的事情(即用{'B', 'a', 'r', '\0'}你可以自由修改的值初始化一个包含4个字符的数组)而不是你做的事情char bar* = "Bar";(你创建一个非const指针,你可能无法修改的4字节字符串) ).
在我看来,你永远不应该将字符串文字直接转换为a char*,而是将其放入const char*当时(如果你正在与遗留API进行通信)明确地const_cast<char*>将其const删除,评论说你正在与具有保证的遗留API进行对话不要改变chars.这样做的好处是,您可以const_cast在API升级时搜索程序,或者您想要找到涉及写入的分段错误的char*来源.
甚至const char*可以使用const_cast在其中执行的版本来包装旧API .
绝对最糟糕的情况是有一堆char*s,其中一些是可写的,另一些来自字符串文字.