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

看几个例子

一个是经典的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";
这一句不是在栈里面的,所以不会被覆盖,可以返回值,结果如下:






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值