您的位置:首页 > 其它

关于局部变量的指针,栈,和栈的释放的几个例子

2014-01-14 19:22 417 查看
看几个例子

一个是经典的1+2=65534:

代码如下

#include <stdio.h>
#include <stdlib.h>

unsigned short *Sum( unsigned char a,unsigned char b) 
{ 
unsigned short S=0; 

S=a+b; 
return &S; 
} 
int main() 
{ 
unsigned short *p=NULL; 
unsigned char a=1,b=2; 
p=Sum(a,b); 
printf("%u+%u",a,b); 
printf("=%u\n",*p); 
printf("=%u\n",p); 
system("pause");
return 0; 
}


这个&s,实际上返回了个指向局部变量的指针,而这个变量在栈上,在函数Sum调用完的时候,就被释放掉了,于是这个指针是指不到想要的值3的,

p=Sum(a,b);

上面这个语句使p得到一个地址,这个地址指向一个曾经的局部变量,这个局部变量在函数Sum()返回后就被操作系统清理掉了。
这个程序的运行结果如下:





现在我们尝试将上面程序的

printf("%u+%u",a,b); 
printf("=%u\n",*p);

这两句调换一下顺序,再运行会发现结果变成了:




我们可以发现,这一次的第一个结果是正确的,也就是1+2=3,因为这一次的printf输出还没有把原来栈里面的数据覆盖掉,而上一个程序里面先写的

printf("%u+%u",a,b);

再写

printf("=%u\n",*p);

这样第一句就把原来栈里面的结果"3"给覆盖掉了,所以得不出,于是我们做如下修改,把这两句用printf("%u+%u=%u\n",a,b,*p);来代替,看看结果:



发现第一行的结果是对的,这时候我们如果将

printf("%u+%u=%u\n",a,b,*p);

printf("%u+%u=%u\n",a,b,*p);

这样连写两行的话,会发现:





原理跟上面的一样
下面我们这样一段程序:


#include<stdio.h>
#include<stdlib.h>
char* check(void)
{
    char *p ="abc\n";
    return p;
}
 
int main()
{
    char *temp = check();
    printf("%s\n",temp);
    printf("%c\n",*temp);
system("pause");
    return 0;
}



对于这里的
char
*p =
"abc\n"
;



这一句不是在栈里面的,所以不会被覆盖,可以返回值,结果如下:








                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: