#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?
答案 0 :(得分:2)
当你创建这个函数并调用它时,函数框被推入堆栈,其中有一个空间用于在那里声明的int变量。现在你增加值并尝试返回该地址。现在功能结束,堆栈帧被删除。你正试图读它。它将随机返回一些东西。啊,它的意义上不是随机的,但它没有定义。你得到0 ..有时候得到1或23或128749或-7364184。
要获得26,你可能想要使用堆中的东西。(或声明一个足够长的数组)。 分配大到足以容纳整数变量的内存。然后操纵它。返回指向它的指针。你会看到你想看到的东西。
注意:它是未定义的行为....当你在不同的时间或不同的机器上运行时,它可能会返回其他内容。 :)
我在这里提到的这个堆和堆栈是特定于实现的。通过堆我的意思是我们分配的动态内存。
答案 1 :(得分:1)
这里的问题是,从int * call()
开始,你将返回一个局部变量的地址,该变量在函数执行完毕后变为无效。使用返回值会调用undefined behavior。
你应该
malloc()
和family)分配内存,然后返回指针。static
变量的整个生命周期。那就是说,不要使用fflush(stdin)
,因为它会调用未定义的行为。引用C11
,章节§7.21.5.2,(强调我的)
如果
stream
指向输出流或最新的输出流 如果没有输入操作,fflush
函数会导致该流的任何未写入数据 要传递到主机环境以写入文件; 否则,行为是 未定义。强>
答案 2 :(得分:-1)
您不应在fflush()
上使用stdin
,它对输入流有未定义的行为。 You can Read about it here
返回局部变量的地址,该函数在函数执行完毕后变为无效将导致未定义的行为。
期待回答,我删除了fflush(stdin)
并在Windows和GCC 4.1.2编译器上获得了输出26
。
正如@Anjaneyulu评论的那样,它也可能是编译器依赖的,但这是我在Windows上测试的截图。