代码输出的说明

时间:2016-12-18 07:54:54

标签: c pointers return lifetime fflush

#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?

3 个答案:

答案 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上测试的截图。

enter image description here