在C 中,这是用字符串初始化char数组的好习惯吗?例如:
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 ::字符串的对象将被更改。否则,就没有一个很大的含义来声明类型std ::字符串而不是指针的对象。
因此,声明的含义完全不同。
char* abc = (char *) ("abcabc");
那很糟糕。不要做。
您正在处理不应该像可以修改的字符串文字。
之后,
abc[0] = 'd';
编译器将不错,但在运行时不能。您需要使用的是:
char abc[] = "abcabc";
这将创建一个可修改的数组。
这两个都不好。
char* abc = (char*) ("abcabc");
字符串文字为 stants ,因此可以存储在写受保护的内存中。因此,写信会崩溃您的程序,这是未定义的行为。
而不是抛弃 constness ,您应该保留 const
并进行复制如果要编辑其内容。
const char* abc = "abcabc";
也应该避免另一个:
std::string abc_str = "abcabc";
const char* abc = abc_str.c_str();
保持const良好
也在PRE C++11
代码中,指针停止有效,因为它不能保证它不是临时的。
最好每次致电abc_str.c_str()
。
很有可能因为c_str()
是如此微不足道的操作,因此编译器将优化它与使用原始指针一样有效。
而不是您应该做的所做的一切都是一路使用std::string
。如果您绝对需要 a 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