c - 为什么第二个 printf 打印垃圾值

标签 c garbage

这是源码

#include <stdio.h>
#include <stdlib.h>

int *fun();

int main()
{  
    int *j;
    j=fun();
    printf("%d\n",*j);
    printf("%d\n",*j);
    return 0;
}

int *fun()
{
    int k=35;
    return &k;
}

输出-

35
1637778

第一个 printf() 打印 35,这是 k 的值,但是

在 main() 中,第二个 printf 打印了一个垃圾值而不是打印 35。为什么?

最佳答案

这里的问题是 fun 的返回是返回局部变量的地址。该地址在函数返回时失效。您只是在第一次调用 printf 时走运。

即使在 fun 返回时本地在技术上被销毁,C 运行时也不会主动销毁它。因此,您第一次使用 *jworking 因为本地的内存还没有被覆盖。 printf 的实现很可能只是通过在方法中使用它自己的局部变量来覆盖它。因此,在第二次使用 *j 时,您指的是使用的任何本地 printf 而不是 k

为了完成这项工作,您需要返回一个地址,该地址指向一个比 fun 生命周期更长的值。通常在 C 中,这是通过 malloc

实现的
int *fun() {
  int* pValue = malloc(sizeof(int));
  *pValue = 23;
  return pValue;
}

因为 malloc 的返回在您调用 free 之前一直存在,这将在多次使用 printf 时有效。一个问题是调用函数现在必须通过返回 fun 来告诉程序它何时完成。要执行此操作,请在第二次调用 printf

后调用 free
j=fun();
printf("%d\n",*j);
printf("%d\n",*j);
free(j);

关于c - 为什么第二个 printf 打印垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20936394/

相关文章:

c - 来自类 C 引用的并行 Verilog CRC 算法

c - 我应该如何转换 14 位位域的字节序?

c - 如何在 C 中获取简单线性搜索函数的输入?

java - 谁来收集垃圾或卸载垃圾收集器

java - 快速 Java 垃圾收集问题

Python 安全 : Danger of uncollected variables out of scope

c - 无法让 Unix FIFO 正常工作?

c++ - C++ 如何处理这个

c - 为什么这会产生垃圾值(value)?

javascript - node.removeChild(node.firstChild) 是否会造成内存泄漏?