c++ - 奇怪的字符数组行为

标签 c++ arrays segmentation-fault

我很激动。为什么这样可以正常工作:

char ptr[] = "hello world!";
ptr[0] = 'H';
printf("%s\n", ptr); // prints "Hello world!"

还有这个:

char * ptr = "hello world!";
ptr[0] = 'H';
printf("%s\n", ptr);

引发段错误

最佳答案

因为 ptr[] 可以被标准修改,但 char * 不能。 char * 使用常量字符串,可以在程序中多次使用该数组实际上创建一个新数组并将您的字符串复制到它。

顺便说一句,这应该会产生编译错误 - 你必须使用

const char *ptr="Hello";

添加更多 - 基本上允许编译器查找引号中的每个字符串并将其放入只读字符串表中。因为你程序中的第 1000 处可以使用和定义字符串“this”。编译器可以变得聪明并将这 1000 个“this”转换为 1,因为它们都是相同的——因此它变成只读的——所以现在一个位置不能在编译时间后修改固定字符串——因为它会破坏你预期的输出来自您的程序。

关于c++ - 奇怪的字符数组行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8237071/

相关文章:

c - 将值映射到数组的通用解决方案

python - 为崩溃的子进程 : no out and err after a call to communicate() 捕获 "Segmentation fault"消息

c++ - 段错误 11 链表

c++ - 我应该什么时候使用 make_heap 与优先队列?

c++ - 一元 * 运算符的操作数是否期望纯右值

c++ - 编译器是否必须评估表达式是否取决于模板参数?

javascript - 如何在 Javascript 中按 15 分钟间隔对 json 集合进行分组

java - 我用什么来跟踪号码?

c++ - 在 Visual Studio 中观察 C++ 数组

ios - 无法执行命令 : Segmentation fault: 11 swift frontend command failed due to signal (use -v to see invocation)