0

可能重复:
为什么会出现此段错误?

在 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;
}

那么代码就完美编译了,上面的代码有什么问题呢?

4

6 回答 6

5

第一个代码片段试图将字符串文字中的字符修改为:

++(*s)

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

第二个片段正在修改一个char变量,该变量不是只读的,如下所示:

char c = *s;

c是第一个字符的副本sc可以安全地递增。

于 2012-08-10T07:43:22.790 回答
2

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

于 2012-08-10T07:42:46.853 回答
2

这段代码:

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

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

于 2012-08-10T07:43:14.970 回答
1

字符 *s = "你好";

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

如果您需要一个非常量字符串,您应该从堆中显式分配它。

于 2012-08-10T07:44:44.460 回答
1

您试图在第一种情况下更改字符串文字,这是不允许的。在第二种情况下,您从字符串文字的第一个字符创建一个新字符。您修改了该字符的副本,这就是第二种情况起作用的原因。

于 2012-08-10T07:44:51.290 回答
0

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

于 2012-08-10T07:45:00.400 回答