可能重复:
Why do I get a segmentation fault when writing to a string?
我希望这个程序的输出是:ibjgsjfoet 但是我遇到了分段错误。
#include <stdio.h>
int main()
{
char *p="haifriends",*p1;
p1=p;
while(*p!='\0')
++*p++;
printf("%s %s",p,p1);
return 0;
}
答案 0 :(得分:10)
我希望这个程序的输出是:ibjgsjfoet
char *p="haifriends",*p1;
haifriends
位于内存的只读部分,无法修改。如果你想修改字符串文字,那么你必须复制。
char p[]="haifriends",*p1;
p1 = p;
答案 1 :(得分:7)
在同一声明中使用两个自动增量是一个麻烦。不要试图变得棘手。编写代码,使其清晰,富有表现力,您将获得更好的结果。
答案 2 :(得分:2)
您正在尝试修改字符串文字:
char *p="haifriends";
++*p;
通常,字符串文字分配在不可写的内存中,因此是段错误。
答案 3 :(得分:1)
无法写入p
所在的内存区域。您只能修改已malloc
或存在于堆栈中的内存:
#include <stdio.h>
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;
}
这绝不是一种好的做法,但我希望这个示例代码能够澄清这个问题。
答案 4 :(得分:1)
这将有效:
#include <stdio.h>
int main()
{
char p[11]="haifriends";
char *p1;
p1=p;
while(*p1!='\0')
++*p1++;
printf("%s %s",p,p1);
return 0;
}
大多数编译器都会在从常量字符串转换为char *
时发出警告答案 5 :(得分:0)
尝试将*p="haifriends"
更改为p[]="haifriends"
。 Iirc不允许修改分配给常规字符指针的字符串文字,但是当它们被分配给字符数组时。
++*p++;
也是未定义的行为。试试*p++;p++;
,或者++*(p++);
,如果这也不是未定义的行为(非常肯定会是这样)。
根据Michael的说法,++*p++;
并非未定义的行为,但我仍然建议您使用*p++;p++;
或++*(p++);
进行澄清,因为他同意这是一个好主意。< / p>