我在某处发现了一个问题......这里是它及其解释的答案。
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 应该打印“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 应该作为它的初始位置,即在字符串的起始地址。如果有人能解释一下我哪里弄错了,请问???
最佳答案
首先,应该避免这样的代码:++*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;
}
关于c - 简单的 C 代码在 gcc 上给出段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8682292/