#include<stdio.h>
int *fun();
main()
{
int *i;
i=fun();
printf("cbgg\n");
printf("%d",*i);
getch();
}
int *fun()
{
int k;
k=5;
return (&k);
}
虽然上面写的程序打印了i的垃圾值,但下面编写的程序工作正常,即。输出绝对相关,即5.为什么会这样?
#include<stdio.h>
int inc();
main()
{
int i;
i=inc();
printf(“cbgg\n”);
printf(“%d”,i);
getch();
}
int inc()
{
int k;
k=5;
return (k);
}
答案 0 :(得分:4)
主要区别在于这个通过返回局部变量的地址(在堆栈上分配)来做一件非常讨厌的事情 - 以后使用返回的指针会调用未定义的行为。
int *fun()
{
int k;
k=5;
return (&k);
}
另一个只是fun()
例程中5的无害回报。
答案 1 :(得分:1)
要理解这一点,您需要了解一些参数如何传递给函数和从函数传递。当调用“fun”时,“fun”的参数被推到堆栈上(除此之外)。为了“有趣”返回值,它将它们推送到堆栈上,然后调用者弹出值。
局部变量int k具有函数范围,因此当函数“fun”退出时,所使用的堆栈空间被破坏。返回指向被破坏的内存区域的指针是未定义的行为,这是您返回&amp; k时正在执行的操作。在#2中,你改为在堆栈上推送k的值,这是有效的。
答案 2 :(得分:0)
在第一种情况下,您将返回指向局部变量的指针,其范围仅限于函数。 无论何时从函数堆返回都会被修改,并且会得到意外的数据。