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

标签 c string pointers gcc segmentation-fault

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

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/

相关文章:

c - 在非常长的字符串中查找频率的最佳方法

C++ DLL 字符参数

c++ - Strcat,2 个字符指针数组

c - 相对于编译器的输出变化

c - 在 free() 之后调用的 malloc() 是否有可能返回指向相同释放内存的指针?

python:SyntaxError:EOL,同时扫描字符串文字

string - 如何用 VB6 替换字符串中的最后一个字符?

Oracle PL/SQL : How to implement pointers to in-memory record types

C: 指针混淆

c++ - 为什么 memset 在二维数组中正确填充 0 但无法在该数组中填充 1?