访问字符指针

Uma*_*ack 2 c++

在C++中,为什么编译器不允许修改以下字符指针,如下所示

#include <iostream>

int main()
{
char* cp = "overflow";
cp[1]='p';
return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:在运行时崩溃.

但字符数组允许,

#include <iostream>

int main()
{
char cps[] = "overflow";
cp[1]='p'; // this compiles fine and output is operflow
return 0;
}
Run Code Online (Sandbox Code Playgroud)

只是想知道运行时发生了什么以及崩溃的原因.谢谢.

And*_*owl 9

字符串文字是类型的左值char const[],其中const重要的部分.尝试修改类型为的对象constUndefined Behavior.

根据C++ 11标准的第2.14.5/8段:

普通字符串文字和UTF-8字符串文字也称为窄字符串文字.窄字符串文字的类型为" n的 数组const char",其中n是下面定义的字符串的大小,并且具有静态存储持续时间(3.7).

在第二种情况下(假设您的意思char cps[] = "overflow";,带方括号),您正在初始化字符串文字的非const 副本.修改该副本就可以了.

另请注意,从字符串文字到非-const char *字母的转换在C++ 03中已弃用,在C++ 11中则是非法的.另一方面,这是合法的:

char const* cp = "overflow";
//   ^^^^^
Run Code Online (Sandbox Code Playgroud)