#include<stdio.h>
int *call();
int main()
{
int *ptr;
ptr=call();
fflush(stdin);
printf("%d",*ptr);
return 0;
}
int * call()
{
int x=25;
++x;
return &x;
}此代码的输出为0。我本来以为26岁的。
谁能解释一下原因吗?
我该怎么做才能拿到26块?
发布于 2016-12-18 07:59:21
当您创建这个函数并调用它时,函数帧会被推入堆栈中,其中包含一个在堆栈中声明的int变量的空间。现在增加值并尝试返回该值的地址。现在函数结束,堆栈帧被删除。你在试着读它。它会随机返回一些东西。啊,从它的意义上说,不是随机的,而是它返回的东西没有被定义。有时你会得到0,..may 1,23,128749或-7364184。
要获得26,您可能需要使用堆中的一些内容。(或者声明一个足够长的数组)。分配足够大的内存以容纳整数变量。那就操纵它。返回指向该值的指针。你会看到你想看到的。
注意:这是未定义的行为..。当您在不同的时间或不同的机器上运行时,它可能会返回其他的东西。:)
我在这里提到的堆和堆栈是特定于实现的。所谓堆,是指我们分配的动态内存。
发布于 2016-12-18 07:59:06
这里的问题是,从int * call()中返回局部变量的地址,在函数完成执行后这个地址就无效了。使用返回值调用未定义行为。
你应该要么
malloc()和系列)分配内存,然后返回指针。static变量的整个生命周期。尽管如此,不要使用fflush(stdin),因为它会调用未定义的行为。引用C11,第7.21.5.2节,(强调地雷)
如果
stream指向未输入最新操作的输出流或更新流,则fflush函数将导致将该流的任何未写入数据传递到主机环境中;否则将写入文件;否则,行为将未定义。
发布于 2016-12-18 08:12:06
您不应该在fflush()上使用stdin,它对于输入流具有未定义的行为。你可以在这里读到。
返回局部变量的地址(该局部变量在函数完成执行后无效)将导致未定义的行为。
为了得到答案,我删除了fflush(stdin),并在Windows 4.1.2编译器上获得了输出26。
正如@Anjaneyulu所评论的那样,它也可能依赖于编译器,但下面是我在windows上测试的屏幕截图。

https://stackoverflow.com/questions/41206470
复制相似问题