【发布时间】:2013-10-14 20:58:24
【问题描述】:
这是我的代码:
#include <stdio.h>
//returning a pointer
int *fun()
{
int i = 10;
//printf ("%u\n",i);
//printf ("%u\n",&i);
return &i;
}
int main()
{
int *p;
p = fun();
printf ("p = %u\n", p);
printf ("i = %u \n",*p);
return 0;
}
如果我删除函数 fun 中的 cmets,那么 main 中的第二个 printf 会显示 10 作为输出。否则它显示一个垃圾值。有什么想法吗?
【问题讨论】:
-
而你想知道的是什么?
i位于堆栈上,因此当函数返回&i时,i的内存位置无效。我想你想说:int* i = malloc( sizeof( int ) ); *i = 10; return i; -
同样在你的 printf 格式字符串中,你传递了 %u,这意味着无符号,但给它一个 int,它是有符号的——将导致未定义的行为。
-
我明白为什么 *p 显示垃圾值,我不明白为什么在函数 fun 中取消注释 printfs 会导致 main 中的第二个 printf 打印正确的输出 10..!
-
或者声明为
static int i = 10; -
返回本地地址会导致未定义的行为。未定义的行为意味着编译器可以为所欲为。如果你有一个非常邪恶的编译器,那么你的代码可以运行多年,然后在半夜在你最大的客户那里失败