首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对代码输出的解释

对代码输出的解释
EN

Stack Overflow用户
提问于 2016-12-18 07:54:53
回答 3查看 229关注 0票数 0
代码语言:javascript
运行
复制
#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块?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-18 07:59:21

当您创建这个函数并调用它时,函数帧会被推入堆栈中,其中包含一个在堆栈中声明的int变量的空间。现在增加值并尝试返回该值的地址。现在函数结束,堆栈帧被删除。你在试着读它。它会随机返回一些东西。啊,从它的意义上说,不是随机的,而是它返回的东西没有被定义。有时你会得到0,..may 1,23,128749或-7364184。

要获得26,您可能需要使用堆中的一些内容。(或者声明一个足够长的数组)。分配足够大的内存以容纳整数变量。那就操纵它。返回指向该值的指针。你会看到你想看到的。

注意:这是未定义的行为..。当您在不同的时间或不同的机器上运行时,它可能会返回其他的东西。:)

我在这里提到的堆和堆栈是特定于实现的。所谓堆,是指我们分配的动态内存。

票数 2
EN

Stack Overflow用户

发布于 2016-12-18 07:59:06

这里的问题是,从int * call()中返回局部变量的地址,在函数完成执行后这个地址就无效了。使用返回值调用未定义行为

你应该要么

  • 取一个指针,使用内存分配器函数(如malloc()和系列)分配内存,然后返回指针。
  • 在整个程序执行过程中,使用static变量的整个生命周期。

尽管如此,不要使用fflush(stdin),因为它会调用未定义的行为。引用C11,第7.21.5.2节,(强调地雷)

如果stream指向未输入最新操作的输出流或更新流,则fflush函数将导致将该流的任何未写入数据传递到主机环境中;否则将写入文件;否则,行为将未定义。

票数 1
EN

Stack Overflow用户

发布于 2016-12-18 08:12:06

您不应该在fflush()上使用stdin,它对于输入流具有未定义的行为。你可以在这里读到

返回局部变量的地址(该局部变量在函数完成执行后无效)将导致未定义的行为。

为了得到答案,我删除了fflush(stdin),并在Windows 4.1.2编译器上获得了输出26

正如@Anjaneyulu所评论的那样,它也可能依赖于编译器,但下面是我在windows上测试的屏幕截图。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41206470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档