以下程序的输出是什么?
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是局部变量,因此它的作用域在函数调用中结束。我发现这段代码是悬空指针的一个例子。
答案 0 :(得分:2)
未定义的行为
因为从call()返回后x范围已经死了所以指向该变量的指针你不能使用ahaed
通过编译您的程序,您将收到以下错误
warning: function returns address of local variable
如果您的程序自从其未定义的行为以来给出输出26。你根本不应该这样做。
答案 1 :(得分:1)
此函数的输出未定义。正如您已经指出的那样,x的范围以函数结束。但是26写的内存并没有使用agian。因此,打印此值将给出26.如果再次使用此内存,则可能是任何内容。
答案 2 :(得分:0)
欢迎您,您已进入Undefined Behavior
山谷。你无法预测什么是任何价值。即使价值有道理,也要忽略它。