17-C语言中的变量生命周期——自动存储期、青苔存储期、自定义存储期

17-C语言中的变量生命周期——自动存储期、青苔存储期、自定义存储期

概念
在C语言中,每个变量都有一个生命周期,即从变量的内存申请到释放的过程。申请内存相当于变量的诞生,释放内存则相当于变量的消亡。变量的生命周期有以下三种形式:

  1. 自动存储期
  2. 静态存储期
  3. 自定义存储期
    在这里插入图片描述

一、自动存储期

自动存储期的变量在栈空间中分配,内存由系统统一管理。自动存储期的几个等价概念包括:

  • 自动化变量:从存储期的角度来描述变量的存储特性
  • 临时变量: 从存储期的角度来描述变量的存储特性
  • 局部变量: 从作用域的角度来表述变量的空间特定

示例

int main(int argc, char const *argv[]) // argc 和 argv 属于自动存储期的局部变量
{
    int a; // 自动存储期 / 局部变量
    static int b; // 静态存储期的局部变量
    func(a, b);
}

void func(int x, int y) // x 和 y 属于自动存储期的局部变量
{
    // 函数体
}

二、静态存储期

静态存储期的变量在数据段中分配,内存在程序运行之初就已经分配好,并且不会随着程序的运行发生申请和释放的问题。静态存储期的变量直到整个程序退出才会释放,生命周期与进程一致。

  • 全局变量,static只是影响他的作用域,并不影响他的存储期.
  • static修饰的局部变量,对于局部变量而言static只是改变了变量的存储期,而没有改变他的作用域.

2.1 示例

int a = 100; // 静态存储期
static int b = 250; // 静态存储期,作用域为本文件

int main()
{
    int k; // 自动存储期 / 局部变量
    static int k = 450; // 静态存储期的局部变量
}

注意:

  • .bss 段存放未初始化的静态变量,初始值为 0
  • .data 段存放已经初始化的静态变量,初始化语句只会被执行一次
  • 静态数据从进程运行之初就已经存在,直到进程退出为止。

三、自定义存储期

自定义存储期的变量在堆内存中分配,内存的申请与释放完全由用户自己控制。

3.1 如何申请内存

  • malloc:只负责申请空间,不会清空内存。
  • calloc:申请内存并默认清空为 0。

3.2 如何释放内存

  • free:负责释放内存,但不会清空内存,也不会让指针指向空,释放后最好将指针设为 NULL

3.3 如何清空内存

  • bzero
  • memset

注意:

  • malloc 只负责申请空间, 并不会清空内存,因此一般使用bzero 清空
  • calloc 负责申请内存,并会默认清空为 0 .
  • free 只负责释放,也不会清空 更不会让指针指向空, 因此free之后最好让指针指向NULL.

3.4 示例

#include <stdlib.h>
#include <string.h>

int main()
{
    int *p = (int *)malloc(10 * sizeof(int)); // 申请内存
    if (p == NULL) {
        // 处理内存分配失败的情况
        return -1;
    }

    // 清空内存
    memset(p, 0, 10 * sizeof(int));

    // 使用内存...

    // 释放内存
    free(p);
    p = NULL; // 释放后将指针设为 NULL
}

总结

  • 自动存储期:变量在上分配,生命周期由系统管理,函数结束时自动释放。
  • 静态存储期:变量在数据段中分配,生命周期与程序一致,程序结束时释放。
  • 自定义存储期:变量在上分配,生命周期由用户管理,用户需要手动申请和释放内存。
  • 22
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写的什么石山代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值