#include<stdio.h>
int* a(int *np)
{
int b=10;
np=&b;
return np;
}
int main()
{
int n=5;
int *p=&n;
p=a(p);
printf("%d\n",*p);
}
上面的程序为什么会打印出结果10?在a函数中定义了一个临时变量b,在函数结束后b不是就消失了吗,按理说p就访问不到了,可还是打印了b的值
下面的程序仅仅多了一行代码却就打印不出b的值了
#include<stdio.h>
int* a(int *np)
{
int b=10;
np=&b;
return np;
}
int main()
{
int n=5;
int *p=&n;
p=a(p);
printf("%p\n",&p);
printf("%d",*p);
}
上面的程序打印出结果10是因为a函数中返回了一个指向b的指针,p指向了这个指针,所以*p即为b的值。但是在a函数中定义的临时变量b是一个局部变量,函数结束后会被销毁,所以使用它的地址是不安全的,实际上这样做是一种未定义行为,在不同的编译器和环境下可能会产生不同的结果。
下面的程序多了一行代码:在main函数中打印了p的地址。这并不影响p指向的地址,但是会导致p的地址被输出,与指向b的指针的地址不同。因此,第二个printf语句将尝试访问错误的地址,结果是未定义的。在某些情况下,可能会输出0或其他值,但不能保证始终如此。
不管你前面的语句打印了什么,值都被销毁了