关于“静态变量不能跨函数使用”的一个疑问
来源:互联网 发布:mac机械键盘推荐 编辑:程序博客网 时间:2024/05/22 17:07
在学习指针时,都会讲到如下实例来验证“静态变量不能跨函数使用”这一观点。
按照注释的理解,最终*p对i的地址所指向的内存单元(i释放后就不能再说这块内存就是i了)不具有操作权限。但是在VC++ 6.0中的实验结果却显示更改i的值时,程序最终显示的就是i的值,与理论矛盾。
/*----------------------------------------------静态变量不能跨函数使用 2015.12.8----------------------------------------------*/#include <stdio.h>void f(int ** q){int i = 100;*q = &i;//2、q内存单元中存放的是p的地址, *q = &i//即把i的地址存入*q(即内存单元p)中}int main(void){int * p;f(&p);//1、调用f()函数,把指针变量p的地址拷贝到q内存单元中printf("%d\n", *p);//3、按照逻辑,此时p中的值为变量i的地址,所以*p等价于访问i变量,//但因为调用f()函数时在栈中开辟的i的存储空间在f()函数执行完毕时//已经释放了,所以此时p对于其内保存的地址所指向的内存单元没//有操作权限return 0;}
按照注释的理解,最终*p对i的地址所指向的内存单元(i释放后就不能再说这块内存就是i了)不具有操作权限。但是在VC++ 6.0中的实验结果却显示更改i的值时,程序最终显示的就是i的值,与理论矛盾。
对于最终结果输出的值与对应的i值相同我并不感到奇怪,因为虽然i变量对应的内存单元被释放了,但这块单元内部的值并不会立刻被改变,释放只是说明它可以被重新使用,所以,如果能够操作i变量对应的地址,那么就可以访问这块内存单元,读出其内部的值。于是我们的问题也就变成了:在f()函数中定义的变量i,随着f()执行完毕内存被释放后,其地址还可以被主函数操作吗?
这个问题,看了很多帖子,却并没有找到满意的答案。。。
0 0
- 关于“静态变量不能跨函数使用”的一个疑问
- 静态变量不能跨函数使用内存
- 关于静态变量(函数)与非静态变量(函数)代码块的使用时机
- 关于++和静态变量的一个题
- 关于用于静态变量实现singleton的多线程互斥的一点疑问
- 关于php_apc的一个疑问
- 关于php_apc的一个疑问
- 关于数据结构的一个疑问
- 一个关于PCA的疑问
- 关于为什么类的静态成员变量不能立即初始化
- 关于为什么类的静态成员变量不能立即初始化
- 关于为什么类的静态成员变量不能立即初始化 .
- 关于为什么类的静态成员变量不能立即初始化
- preg_split 函数的一个疑问?
- 关于getline函数的疑问
- 关于getline函数的疑问
- 关于fcntl()函数的疑问
- 关于sleep函数的疑问
- 七牛---关于PHP SDK的各种Demo
- Qt动态链接库的生成和应用
- ArrayAdapter的简单使用
- Launcher3源码分析 — 数据加载过程
- greendao->报错:java.lang.NoClassDefFoundError: database.dao.DaoMaster
- 关于“静态变量不能跨函数使用”的一个疑问
- fs_initcall、early_initcall、__init宏
- Ducci 队列
- Windows环境下java编译出错的解决方法
- OpenSSH 仅用于端口转发(仅使用SSH隧道,禁止Shell)
- 孤华暗香的Python Spider,Updating
- ECMAScript 引用类型
- 把图片变为圆形的方法(QQ头像)
- 北大OJ1000