简单的C代码在gcc上给出了分段错误

时间:2011-12-30 17:45:25

标签: c string pointers gcc segmentation-fault

我在某个地方找到了一个问题......这里是它的答案和解释。

main()
{
char *p="hai friends",*p1;
p1=p;
while(*p!='\0') ++*p++;
printf("%s   %s",p,p1);
}

 Answer:
 ibj!gsjfoet

 Explanation:
++*p++ will be parse in the given order

* p表示当前由p指出的位置的值

++ * p检索到的值将递增

时;遇到的位置将递增,即p ++将被执行

因此,在while循环中,p指向的初始值是'h',通过执行++ * p变为'i',指针移动到point,'a',类似地变为'b',等等。类似地,空格被转换为'!'。因此,我们在p中获得的值变为“ibj!gsjfoet”并且因为p到达'\ 0'并且p1指向p因此p1不打印任何东西。

我发现p1上的解释有问题。我认为p1应该打印“hai friends”,p的输出就好了。

但是当我尝试在gcc编译器上运行相同的代码时,它给出分段错误

这是我试图运行的确切代码..

 #include<stdio.h>
 int main()
 {
 char *p="hai friends",*p1;
 p1=p;
 while(*p !='\0') ++*p++;
 printf("%s   %s",p,p1);
 return 0;
 }

如果可能的话编辑标题,我找不到合适的标题来更清楚地解释这种情况。

编辑:

我尝试按照 Mysticial 的建议运行修改过的代码,但我认为输出应该是 -

ibj!gsjfoet    hai friends

因为我只增加p0但是p1应该作为它的初始位置,即在string的起始地址。如果有人能解释它我在哪里错了???

2 个答案:

答案 0 :(得分:4)

对于一个人来说,像这样的代码:++*p++应该避免,因为它通常很难阅读。

其次,问题是您 修改字符串文字 。这是未定义的行为。不要这样做。

相反,请将您的声明更改为:

char p[] = "hai friends";
char *p1;

并修改代码:

int main()
{

    char p[] = "hai friends";
    char *p0,*p1;
    p0 = p;
    p1 = p;
    while(*p0 !='\0') ++*p0++;
    printf("%s   %s",p0,p1);
    return 0;

}

答案 1 :(得分:1)

"hai friends"是一个无法修改的文字字符串。