2011-10-17 125 views
0

以下程序的输出是什么?本地指针变量

int *call(); 

void main() { 
    int *ptr = call(); 
    printf("%d : %u",*ptr,ptr); 
    clrscr(); 
    printf("%d",*ptr); 
} 

int *call() { 
    int x = 25; 
    ++x; 
    //printf("%d : %u",x,&x); 
    return &x; 
} 

期望输出:垃圾值
实际输出:26 #someaddr

由于x是一个局部变量它的范围在函数调用之内结束。我发现这个代码是悬挂指针的例子。

+1

由于您提到的原因,该程序显示未定义的行为。你的问题是什么?你期待什么,你有什么。 –

+0

当然有:“ptr = call();”?不是“ptr = call”吗? – danihp

+2

实际上,在这种情况下,26是垃圾值。 – mouviciel

回答

1

该函数的输出未定义。正如你已经指出的那样,x的范围以函数结束。但是已经写入26的内存并未被使用。所以打印这个值会得到26.如果再次使用这个内存,它可能是任何东西。

2

未定义行为

,因为在X范围是死的从调用返回时(),所以指针变量不能ahaed

使用的编译程序时,你会得到以下错误

warning: function returns address of local variable 

如果你的程序自从给出输出26以来它的未定义行为。你根本不应该这样做。

0

欢迎,您已进入Undefined Behavior山谷。你无法预测什么是任何价值。即使这个价值有道理,也可以忽略它。