我在某个地方找到了一个问题......这里是它的答案和解释。
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的起始地址。如果有人能解释它我在哪里错了???
答案 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"
是一个无法修改的文字字符串。