#include<stdio.h>
int* check(int,int);
int main()
{
int *c,t = 2;
c = check(10,20);
printf("t = %d\n",t);
printf("c = %d\n",*c);
return 0;
}
int* check(int i,int j)
{
int *p,*q;
p = &i;
q = &j;
if(i>=45)
return (p);
else
return (q);
}
我得到的代码输出为:
t = 2
c = 2
为什么呢?因为根据这个概念,返回给c的值是j地址,即* c的值是20但是因为在c的printf语句之前有一个printf语句,因此,* c的值应该是一些垃圾值作为栈改变了。
任何人都可以帮助我吗?请帮助!!
答案 0 :(得分:3)
Dangling Pointer的情况。在提供任何Undefined
时,引用悬空指针为unpredictable value
。
答案 1 :(得分:1)
这是非常危险的编码
int *p,*q;
p = &i;
q = &j;
我&amp; j两个值都在堆栈中,一旦检查例程结束,它们就会从内存中删除。
通过传递左值而不是右值来做其他方式(因为你想要一个指针作为回报)
#include<stdio.h>
int* check(int*,int*);
int main()
{
int *c,t = 2;int dummy=30;
c = check(&t,&dummy);
printf("t = %d\n",t);
printf("c = %d\n",*c);
return 0;
}
int* check(int *i,int *j)
{
if(*i>=45)
return (i);
else
return (j);
}
答案 2 :(得分:0)
编辑:在我的gcc C遭到破坏:)所以你很幸运。只是不要在生产中这样做:) 实际上gcc -O3表现出无堆栈更改行为,gcc更改了堆栈。所以“未定义的行为”。