关于局部变量的指针,栈,和栈的释放的几个例子
2014-01-14 19:22
417 查看
看几个例子
一个是经典的1+2=65534:
代码如下
这个&s,实际上返回了个指向局部变量的指针,而这个变量在栈上,在函数Sum调用完的时候,就被释放掉了,于是这个指针是指不到想要的值3的,
p=Sum(a,b);
上面这个语句使p得到一个地址,这个地址指向一个曾经的局部变量,这个局部变量在函数Sum()返回后就被操作系统清理掉了。
这个程序的运行结果如下:
现在我们尝试将上面程序的
这两句调换一下顺序,再运行会发现结果变成了:
我们可以发现,这一次的第一个结果是正确的,也就是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);
这样连写两行的话,会发现:
原理跟上面的一样
下面我们这样一段程序:
对于这里的
一个是经典的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"
;
这一句不是在栈里面的,所以不会被覆盖,可以返回值,结果如下:
相关文章推荐
- C#关于事件的几个好例子
- 关于递归算法的几个例子(C语言)
- 关于释放指针引发的一个错误
- 指针释放和局部变量的大小
- 关于鼠标、键盘的几个事件的例子
- 关于C中函数参数,指针-常量-引用解释的4个函数例子
- 关于几个指针的问题
- 关于文件操作的几个例子
- jfreechar关于坐标轴的几个小例子
- flex开发中关于内存释放几个注意的地方
- 关于动态数组指针操作的两个例子
- C++关于不能返回局部变量的指针的研究
- 关于指针的调用实现单向链表及指针函数的几个小问题
- 关于CFindReplaceDialog 指针的 释放
- 关于指针应注意的几个小问题
- 关于C++中结构体及其指针成员的内存分配和释放
- 【c++程序】关于指针易混淆的几个概念
- 关于回调函数的几个例子
- 关于动态数组指针操作的两个例子
- 关于BAT编程的几个典型的小例子