如果我们声明char * p="hello";
则因为它是写在数据部分中,我们不能修改到其中p点,但我们可以通过修改指针本身的内容.但我发现在C陷阱与误区安德鲁·柯尼希AT&T贝尔实验室的Murray Hill这个例子中,新泽西州07974
这个例子是
char *p, *q;
p = "xyz";
q = p;
q[1] = ’Y’;
Run Code Online (Sandbox Code Playgroud)
q将指向包含字符串xYz的内存.p也是如此,因为p和q指向相同的内存.
如果我提到的第一个语句也是真的,那怎么回事呢?同样我运行了下面的代码
main()
{
char *p="hai friends",*p1;
p1=p;
while(*p!='\0') ++*p++;
printf("%s %s",p,p1);
}
Run Code Online (Sandbox Code Playgroud)
得到的输出为
ibj!gsjfoet
请解释在这两种情况下我们如何修改内容?提前致谢
您的相同示例会导致系统出现分段错误.
你在这里遇到了未定义的行为..data
(请注意,字符串文字也可能是.text
不可变的) - 无法保证机器将写入保护该内存(通过页表),具体取决于操作系统和编译器.