gpt4 book ai didi

c - 简单的 C 代码在 gcc 上给出段错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:39 25 4
gpt4 key购买 nike

我在某处发现了一个问题......这里是它及其解释的答案。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com