2012-08-10 137 views
0

可能重复:
Why does this Seg Fault?对char分割故障++运算符*

我在一个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; 
} 

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

回答

5

第一代码段正试图以改变一个字符在字符串文本:

++(*s) 

试图递增的第一个字符在s。字符串文字是(通常)只读的,并且尝试修改会导致分段错误(C标准状态如果程序试图修改这样的数组,则行为不确定。)。

第二代码段修改char变量,它不是只读如后:

char c = *s; 

c复制的第一个字符的sc可以安全地递增。

2

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

2

此代码:

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

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

1

char * s =“hello”;

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

如果你需要一个非常量字符串,你应该从堆中明确地分配它。

1

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

0

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