关于子函数变量生命周期以及指针的一些问题

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函数申请一块受保护的空间,再把申明的变量放在该空间内,这样在子程序退出的时候就不会释放空间。程序就能正常的运行,得到我们想要的结果。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值