C语言的变量都有自己的生存周期,如果超过这个周期,那么它所占用的地址空间就会被释放掉。不再受到保护。因此主函数中要用到的变量不能在子函数里面申明。
即便是使用了指针的方式仍然不能保证程序能够将变量准确的在主函数当中被使用。
下面用一些真实的代码来说明:
#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函数申请一块受保护的空间,再把申明的变量放在该空间内,这样在子程序退出的时候就不会释放空间。程序就能正常的运行,得到我们想要的结果。