返回一个局部变量的指针造成的错误

#include<stdio.h>

char *p_fun()
{
char a[]={"hello"};
char *p=a;
return p;
}
int main(int argc, const char *argv[])
{
printf("%s",p_fun());
return 0;

}

比如a的地址是0x0001,那么p里面存放的就是ox0001,而0x00001此时存放的是“hello”。返回p,p中的值得到保存,也就是可以得到0x0001。去找0x0001中存放的值,找不到hello,因为return p只能保存一个p的值,也就是保存了0x0001。但是0x0001中的内容已经被释放掉了。

如果改成下面的形式

#include<stdio.h>
char *mystring()
{ char a[]="hello";
return a;
}
int main(int argc, const char *argv[])
{
printf("%s\n",mystring());
return 0;
}

这样也是不可以的,因为设a的地址是0x0001,可以找到0x0001,但是0x0001中的内容也已经被改变了。

而如果是

int test(int a,int b)

{

int sum;

sum=a+b;

return sum;

}

此时是返回了sum中的值,而sum中的值已经由上一步计算好了放在sum里了,此时不用通过sum去找a和b,此时也找不到,因为a和b已经被释放了找不到了,

不同于通过局部变量的地址去找局部变量,这里直接将结果输出了,没有利用地址去寻找。所以不管有没有中间变量,通过局部变量的地址去找局部变量,肯定是找不到的,但是局部变量计算的结果是可以通过return保存的。

并且注意,在使用一个指针变量的时候,如果将指针指向的内存空间释放了,但是指针仍然指向这块空间,如果再次使用这个指针的话,指针里的内容是任意值,所以需要

将指针进行一个初始化。p=null



猜你喜欢

转载自blog.csdn.net/chengchaonan/article/details/79651683