关于子函数变量生命周期以及指针的一些问题
2015-09-21 17:24
274 查看
C语言的变量都有自己的生存周期,如果超过这个周期,那么它所占用的地址空间就会被释放掉。不再受到保护。因此主函数中要用到的变量不能在子函数里面申明。
即便是使用了指针的方式仍然不能保证程序能够将变量准确的在主函数当中被使用。
下面用一些真实的代码来说明:
上面这段代码偶尔能正成运行,显示出我们想要的结果,大多数的时候不能够得到我们想要的结果。这是因为子函数里面申请的变量在子函数退出的时候就自动释放掉空间(这里说的释放空间,并不是说改变该内存区域内的值,而是解除对该区域的占用,系统可以将该区域分配给别的需要使用内存的代码段。)如果系统没有将该区域重新分配出去,那么这个程序就能正常的运行,如果被分配出去了,就可能输出一些乱码。又或者,该区域被分配成一块受保护的区域,那么程序运行的时候就会报错。
如果要对原程序改进,可以有如下的方式:在子函数当中用malloc函数申请一块受保护的空间,再把申明的变量放在该空间内,这样在子程序退出的时候就不会释放空间。程序就能正常的运行,得到我们想要的结果。
即便是使用了指针的方式仍然不能保证程序能够将变量准确的在主函数当中被使用。
下面用一些真实的代码来说明:
#include <stdio.h> #include <stdlib.h> typedef struct _Node{ int data; int data2; struct _node *next; }Node,*PNode; void test (Node *head){ Node *node; node->data = 1; node->data2 = 2; node->next = NULL; head->next = node; Node *p = head->next; printf("%d\n",p->data); } int main() { Node *head; Node node; node.data = 0; node.data2 = 0; head = &node; test(head); Node *p = head->next; // printf("%p\n",head->next); printf("%d\n",p->data); printf("%d\n",p->data); printf("%p\n",p); printf("%d\n",p->data); return 0; }
上面这段代码偶尔能正成运行,显示出我们想要的结果,大多数的时候不能够得到我们想要的结果。这是因为子函数里面申请的变量在子函数退出的时候就自动释放掉空间(这里说的释放空间,并不是说改变该内存区域内的值,而是解除对该区域的占用,系统可以将该区域分配给别的需要使用内存的代码段。)如果系统没有将该区域重新分配出去,那么这个程序就能正常的运行,如果被分配出去了,就可能输出一些乱码。又或者,该区域被分配成一块受保护的区域,那么程序运行的时候就会报错。
如果要对原程序改进,可以有如下的方式:在子函数当中用malloc函数申请一块受保护的空间,再把申明的变量放在该空间内,这样在子程序退出的时候就不会释放空间。程序就能正常的运行,得到我们想要的结果。
相关文章推荐
- 1005. 继续(3n+1)猜想 (25)
- Java中 List、Set、Map
- Java程序的运行机制和JVM
- 个人C++ 编码规范
- 第3周SHH数据结构—【项目3 - 求集合并集】
- 【第4周 项目1 - 建立单链表】
- linux自学心得之--安装内核头文件
- 第4周、项目1—建立单链表
- Could not execute auto check for display colors using command /usr/bin/xdpyinfo.(
- 从标准输入读取C源代码,并验证所有的花括号都正确的成对出现
- Java:按值传递还是按引用传递详细解说
- Debian软件包管理工具apt-get和dpkg操作备忘
- Bitmap与Drawable相互转化
- 潘鹏整理WPF(6)带标题的内容控件GroupBox&&Expander&&TabControl
- 第四周项目1建立单链表
- 第4周项目1 - 建立单链表
- 将一张图片分成多个区域设置多个超链接
- 第三周项目4-顺序表的应用
- 一次密码文件丢失导致的dataguard复制中断
- Linux下的有名管道(06)---使用两个管道实现两个进程之间的通信(手机模式)