奇怪的char数组行为

时间:2011-11-23 03:51:00

标签: 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);

提出Segmentation Fault

2 个答案:

答案 0 :(得分:3)

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

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

const char *ptr="Hello";

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

答案 1 :(得分:3)

在案例1中,ptr是一个可以更改其内容的字符数组

在案例2中,ptr是指向字符串文字的指针,它通常存储在只读部分中。更改它会导致未定义的行为。 Segfault就是其中的一种表现形式。