【发布时间】:2013-03-22 12:00:44
【问题描述】:
如果我声明一个字符数组 (char str[]),我可以更改其中的任何字符。
但是,如果我像这样声明该数组 - char* str="abcd"; 它不可能更改内部的任何字符。
这是为什么?他们不应该是同一个东西吗?
【问题讨论】:
-
为什么说这是不可能的?你有任何错误吗?
如果我声明一个字符数组 (char str[]),我可以更改其中的任何字符。
但是,如果我像这样声明该数组 - char* str="abcd"; 它不可能更改内部的任何字符。
这是为什么?他们不应该是同一个东西吗?
【问题讨论】:
当你声明一个字符数组时
char myarr[5] = "abcd";
这是 你的 数组。 abcd 字母被复制到您的本地数组中,您可以随意使用它。 c++ 中的字符串文字(“”中的字符串)的类型为 const char[N] 。你可以存储一个指向它的指针
const char* p = "abcd"
现在,因为 p 是 const,你不能修改你的字符串文字,这很好。不幸的是,由于历史原因,存在从字符串文字到char*的隐式转换
char * p = "abcd"
在这种情况下,很遗憾您可以修改字符串文字,但这样做会导致未定义的行为。幸运的是,这种转换已被弃用。
请注意,这是字符串文字的一个独特问题,因为它是唯一的左值文字类型。所有其他文字都是右值,因此没有修改它们的概念。
【讨论】:
-std=c++11 模式下的 GCC 4.7 并不认为这是一个错误,而只是发出警告 deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char* 为Read Only Memory 中的字符串保留空间,因此您无法更改它。而char str[] 在堆栈上。 char* 类型的变量的行为类似于 const,因此您无法更改它。
【讨论】:
在前一种情况下,您将数组声明为,
char str[SIZE];
分配的内存属于你的程序,可以修改。
在后一种情况下,
char* str="abcd" ; // str is a pointer to string literal, essential makes it a const char *
您正在尝试写入只读内存位置,但行为未定义。
【讨论】:
如果您创建一个array of char = char[],这将在堆栈上保留包含您放入其中的符号的空间 + \0。因为它在堆栈上,所以可以写入。
但是像char *pc = "abcd" 这样的东西会在程序的只读部分中创建一个字符串“abcd”。你只有一个指向只读字符串或者const char*的指针。
【讨论】: