我在某处找到了一个问题...这里是它的解释和答案。简单的C代码在gcc上给出分段错误
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',并且指针移动到点,'a'类似地改变为'b'等等。同样的空格被转换为'!'。因此,我们在p中获得的值变成“ibj!gsjfoet”,并且由于p到达'\ 0'并且p1指向p,因此p1不会打印任何东西。
我发现P1上的解释有问题,我认为P1应该打印“海朋友”,并且输出的p是正确的。
,但是当我试图运行gcc编译相同的代码,它给segmentatiion故障
这里是我试图运行的确切代码..
#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应作为它的起始位置,即在字符串的起始地址。请如果有人能解释它在哪里,我得到它错了?
这*必须*重复。懒得去搜索它。 – Tom 2011-12-30 18:01:26