char *上的分段错误++运算符

时间:2012-08-10 07:40:32

标签: c segmentation-fault

  

可能重复:
  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;
}

然后代码编译完美,上面的代码有什么问题?

6 个答案:

答案 0 :(得分:5)

第一个代码段正在尝试将字符串文字中的字符修改为:

++(*s)

正在尝试增加s中的第一个字符。字符串文字(通常)是只读的,尝试修改会导致分段错误(C标准声明如果程序试图修改这样的数组,则行为未定义。)。

第二个代码段正在修改char变量,该变量不是只读的:

char c = *s;

cs中第一个字符的副本c可以安全递增。

答案 1 :(得分:2)

在第一种情况下,您修改常量文字,在第二种情况下修改变量。

答案 2 :(得分:2)

此代码:

printf("%c ", ++(*s));

尝试通过指向其中一个字符的指针来修改字符串文字。修改字符串文字是未定义的行为 - 很可能的结果是字符串文字通常存储在只读存储器中,因此修改它们在技术上是非法的,这就是为什么它表现为你的分段错误的原因系统

答案 3 :(得分:1)

char * s =“你好”;

这意味着's'是一个常量字符串。

如果需要非const字符串,则应该从堆中明确分配它。

答案 4 :(得分:1)

您正尝试在第一种情况下更改字符串文字,这是不允许的。在第二种情况下,您将从字符串文字的第一个字符创建一个新的字符。您修改该角色的副本,这就是第二种情况的原因。

答案 5 :(得分:0)

您的代码对存储字符串文字的段没有写入权限。