在C 中,这是用字符串文字初始化char数组的好习惯



在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

最新更新