【发布时间】:2011-12-30 17:45:24
【问题描述】:
我在某处发现了一个问题......在这里,它的答案带有解释。
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'的点,'a'类似地更改为'b'和很快。类似地,空格被转换为“!”。因此,我们在 p 中获得的值变成了“ibj!gsjfoet”,并且由于 p 达到了“\0”并且 p1 指向 p,因此 p1 不打印任何内容。
我发现 p1 的解释有问题。我认为 p1 应该打印“hai friends”并且 p 的输出很好。
但是当我尝试在 gcc 编译器上运行相同的代码时,它给出了 segmentatiion fault
这是我尝试运行的确切代码..
#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 应该作为它的初始位置,即字符串的起始地址。请如果有人能解释一下我哪里弄错了???
【问题讨论】:
-
这个必须是重复的。不过懒得找了。
标签: c string pointers gcc segmentation-fault