这是源码
#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 运行时也不会主动销毁它。因此,您第一次使用 *j
是 working 因为本地的内存还没有被覆盖。 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/