可能重复:
Why does this Seg Fault?
在char *
上使用++运算符时收到分段错误#include<stdio.h>
int main()
{
char *s = "hello";
printf("%c ", ++(*s));
return 0;
}
但如果我这样做:
#include<stdio.h>
int main()
{
char *s = "hello";
char c = *s;
printf("%c ", ++c);
return 0;
}
然后代码编译完美,上面的代码有什么问题?
答案 0 :(得分:5)
第一个代码段正在尝试将字符串文字中的字符修改为:
++(*s)
正在尝试增加s
中的第一个字符。字符串文字(通常)是只读的,尝试修改会导致分段错误(C标准声明如果程序试图修改这样的数组,则行为未定义。)。
第二个代码段正在修改char
变量,该变量不是只读的:
char c = *s;
c
是s
中第一个字符的副本,c
可以安全递增。
答案 1 :(得分:2)
在第一种情况下,您修改常量文字,在第二种情况下修改变量。
答案 2 :(得分:2)
此代码:
printf("%c ", ++(*s));
尝试通过指向其中一个字符的指针来修改字符串文字。修改字符串文字是未定义的行为 - 很可能的结果是字符串文字通常存储在只读存储器中,因此修改它们在技术上是非法的,这就是为什么它表现为你的分段错误的原因系统
答案 3 :(得分:1)
char * s =“你好”;
这意味着's'是一个常量字符串。
如果需要非const字符串,则应该从堆中明确分配它。
答案 4 :(得分:1)
您正尝试在第一种情况下更改字符串文字,这是不允许的。在第二种情况下,您将从字符串文字的第一个字符创建一个新的字符。您修改该角色的副本,这就是第二种情况的原因。
答案 5 :(得分:0)
您的代码对存储字符串文字的段没有写入权限。