gpt4 book ai didi

c - 为什么这个程序会崩溃?

转载 作者:行者123 更新时间:2023-11-30 21:42:13 24 4
gpt4 key购买 nike

#include <stdio.h>
#include <stdlib.h>

int main()
{
int i = 0, j = 0;
int *p = (int *)malloc(1*4);
for(;;)
{
scanf("%d", p+i);
if(*(p+i) == 42)
{
break;
}
i++;
}
for(j = 0; j < i; j++)
{
printf("%dn", j);
}
}

因为我知道我只创建了一个 4 字节的 block ,但由于我们获得了存储在 p 中的基地址,所以我可以根据需要探索循环下的地址,即我会将值存储在连续的内存位置,直到遇到 42,问题是程序对于 5 个输入运行良好,但如果输入超过 5 个,程序就会崩溃。

我发现这个问题的解决方案是亚历克斯·洛普(Alex Lop)所定义的未定义行为,但进一步我想知道为什么这有效???

#include<stdio.h>
#include<stdlib.h>
int main()
{
int i=0,j=0;
int *p=(int *)malloc(1*4);
for(i=0;i<20;i++)
{
printf("%d\n",p+i);
}
}

在这里打印分配的内存堆之外的地址时它不会崩溃,它最终打印我尚未分配的地址。

最佳答案

你实际做的事情被称为“未定义的行为”。

您分配 4 个字节,然后将整数存储到该缓冲区中。它对于第一个整数(或者如果您的机器上的 sizeof(int)==2 则可能是两个)工作正常,但对于下一个整数,行为变得不确定。它可能会立即出现段错误,并且可能需要更多类似的存储,直到崩溃。这里输入的数量“5”没有任何意义,它在不同的机器上和具有不同的编译标志时可能表现不同。

根据我所看到的(或从代码中假设的),您希望接受输入,直到得到“42”。所以实际上您不必存储输入值。这是你的代码,没有无用的东西:

#include<stdio.h>
#include<stdlib.h>

int main()
{
int in;

for(;;)
{
scanf("%d",&in);
printf("%d\n", in); // adding this line because it was explained to
// me that the input values should be printed and
//it is something I couldn't understand from the original code.
if(in == 42)
{
break;
}
}

return 0;
}

关于c - 为什么这个程序会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33063494/

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