当我尝试修改字符串常量时,为什么会出现分段错误?

可能重复:
为什么在写入字符串时会出现分段错误?

我希望这个程序的输出是:ibjgsjfoet但是我得到了一个分段错误。

#include  int main() { char *p="haifriends",*p1; p1=p; while(*p!='\0') ++*p++; printf("%s %s",p,p1); return 0; } 

您正在尝试修改字符串文字:

 char *p="haifriends"; ++*p; 

通常,字符串文字分配在不可写的内存中,因此是段错误。

我希望这个程序的输出是:ibjgsjfoet

 char *p="haifriends",*p1; 

haifriends驻留在内存的只读部分,无法修改。 如果您希望修改字符串文字,则必须复制。

 char p[]="haifriends",*p1; p1 = p; 

在同一个声明中使用两个自动增量是一个麻烦。 不要试图变得棘手。 编写代码,使其清晰,富有表现力,您将获得更好的结果。

p所在的存储区域无法写入。 您只能修改malloc ed或堆栈中的内存:

 #include  int main() { char buffer[11]; char *p,*p1; strcpy(buffer, "haifriends"); p = &buffer[0]; p1=p; while(*p!='\0') ++*p++; printf("%s %s",p,p1); return 0; } 

这绝不是好的做法,但我希望这个示例代码澄清了这个问题。

这将有效:

 #include  int main() { char p[11]="haifriends"; char *p1; p1=p; while(*p1!='\0') ++*p1++; printf("%s %s",p,p1); return 0; } 

大多数编译器在从常量字符串到char *的转换时发出警告

尝试将*p="haifriends"改为p[]="haifriends" 。 Iirc不允许修改分配给常规字符指针的字符串文字,但是当它们被分配给字符数组时。

++*p++; 是未定义的行为。 试试*p++;p++; ,或者++*(p++); 如果那也不是未定义的行为(虽然确实会这样)。

根据迈克尔, ++*p++; 不是未定义的行为,但我仍然建议使用*p++;p++;++*(p++); 澄清,因为他同意这是一个好主意。