2

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

#include <iostream>

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

输出:运行时崩溃。

但字符数组允许,

#include <iostream>

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

只想知道运行时发生了什么以及为什么会崩溃。谢谢你。

4

4 回答 4

9
于 2013-04-10T11:35:46.410 回答
2

This: char* str="";, 是一个字符串文字,可能存储在内存的只读部分中,因此可能会崩溃。使用const char* const str="string";(指针和数据都是常量或至少数据应该是常量:const char* str="string";char const* str="string";

如果您尝试更改字符串文字的内容,这是未定义的行为,并且可能发生导致崩溃的分段错误。

于 2013-04-10T11:35:55.087 回答
0

当您设置时,您正在创建一个包含(后跟 NULL 终止字节)char* cp = "overflow";的只读内存块,因此您不能在那里写入。"overflow"试图改变c[x]需要写在那里。

至于您的第二个代码块-缺少某些内容,因此部分问题不清楚。

于 2013-04-10T11:36:32.053 回答
0

因为指向字符的指针不是 anarray和 a low-level const。你可以做

char cp[] = {'o', 'v', 'e', 'r', 'f', 'l', 'o', 'w', '\0'};

char *pcp = cp;

*++pcp = 'p';

但是,"overflow"它是一个不可修改的恒定字符序列,因此您只能执行指针算术并取消引用指针的值。

char *cp = "overflow";

std::cout << *++cp std::endl;
于 2013-04-10T12:09:13.983 回答