这个声明
char* abc = (char *) ("abcabc");
其实很糟糕。在C++中,字符串字面值的类型是常量字符数组。因此,有效的声明看起来应该像这样:
const char *abc = "abcabc";
注意:在 C 语言中,你确实可以编写
char *abc = "abcabc"
尽管字符串字面值是不可变的,但任何试图修改字符串字面值的行为都会导致未定义的行为。
顺便说一下,没有任何字符数组是由字符串字面值初始化的。:) 也许你指的是以下内容
char abc[] = "abcabc"
使用标准类std::string
并不排除使用字符数组,甚至字符串字面量的指针。
请注意这些声明:
const char *abc = "abcabc";
and
std::string abc_str = "abcabc";
const char* abc= abc_str .c_str();
与第一个声明不同,字符串字面量具有静态存储期,并且它们的地址在程序执行期间不会改变。
在第二个声明中,指针abc
指向可以被重新分配的动态分配内存,如果对象abc_str
被更改,则指针将无效。
此外,第一个声明假定指针所指向的数组(字符串字面量)不会更改。在第二个声明中,假定std::string类型的对象将被更改。否则,声明std::string类型的对象而不是指针没有太大的意义。
因此,这些声明的含义是完全不同的。
abc_str
被修改了,那么abc
可能指向无效的内存。 - Praetorianconst char* s = hello"
(非const已被弃用)。 - user2249683