【问题标题】:Garbage value retrieval [duplicate]垃圾值检索[重复]
【发布时间】:2017-07-09 10:16:17
【问题描述】:
#include<stdio.h>
#include<conio.h>

int *x()
{
  int y=10;
  return (&y);
}

void main()
{
  int *p;
  clrscr();
  p=x();
  printf("%d",*p);  // Output 10
  getch();
}

这里当我们调用 x() 函数时,x 的激活记录被压入堆栈。当我们退出该函数时,激活记录和其中的所有局部变量都被破坏了。 那么,从 x 函数出来后,我们如何才能在 main 函数中访问 y 的值呢?输出值应该是一些垃圾值,因为“y”变量被破坏了。

【问题讨论】:

  • 它在哪里说它必须是垃圾值? C 规范的哪一部分做出了这样的保证?
  • 我的意思是垃圾值或任何未定义的值。我的观点是 y 的值 10 不应该是输出吧?
  • 不,这是一个完全错误的假设。未定义表示任何值 - 包括 10。

标签: c pointers


【解决方案1】:

函数x 返回指向自动局部变量的指针并导致未定义的行为。在这种情况下,可以看到任何预期或意外的结果。

【讨论】:

    【解决方案2】:

    局部变量有一个有限的生命周期,只能在它们被定义的块{} 内扩展。他们有一个本地范围

    当控件到达块的末尾时,其中变量的所有存储不保证不可写。

    这部分内存可以重复使用。那将会?谁知道呢。

    翻译为:undefined behaviour!

    【讨论】:

      【解决方案3】:

      不像“y”被破坏。 它的内存区域被标记为“可写”

      因此,您可能会找到“y”以及垃圾值。 毕竟,函数返回的是指针,而不是变量本身

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-28
        • 1970-01-01
        相关资源
        最近更新 更多