2015-11-09 37 views
-7

我有这样的代码:C'S未定义行为

#include <stdio.h> 
#include <math.h> 
int *fun(); 
int main() 
{ 
    int *t; 
    t=fun(); 
    printf("%d\n",*t); 
    printf("%d\n",*t); 
} 
int *fun() 
{ 
    int r=95; 
    return(&r); 
} 

这段代码中的代码块中显示的输出

95 
-2 

我不知道为什么第二printf()正在打印垃圾的价值。有人可以解释一下吗?

+0

使用原型声明器!并启用编译器警告。 – Olaf

+1

通过在答案指出缺失后编辑'int fun()' - >'int * fun()',否定答案的值。更好地1)恢复编辑。 2)如果需要,附上一张纸条,承认这个问题并需要继续帮助。 – chux

+0

请告诉我们,当你编译这个时,你得到了什么警告。 –

回答

1

这是UB,因为rfun()中的一个局部变量,如果您返回本地变量的地址并尝试在调用方中使用它,那么您在结束使用它之后终止使用它。在C中,它被定义为UB。

FWIW,一个变量的地址是并不总是等同于int或可以安全地转换为指针,因而应该是int *,至少。在你的代码,

t=fun(); 

return(&r); 

应该给你的警告!

+0

此外,返回一个指针为'int'是不好的。 – MikeCAT

+0

@MikeCAT是的,没错。 –

+3

它实际上应该是。 http://port70.net/~nsz/c/c11/n1570.html#6.3.2.3p6。只有两个安全的整数才能成为'(u)intptr_t'。 – Olaf

0
  1. 您返回从funint*,即使它声明为返回int。将声明更改为int* fun()

  2. An empty list allows a variable number of arguments。改为使用int* fun(void);

  3. 未定义的行为是未定义的行为。您尝试access memory of a local variable from outside the function,因此可能发生任何事情。从C标准的水平来看,很明显,undefined无论第一个,第二个还是no语句都表现得很奇怪(如“打印垃圾值”)。