08 – 数据结构基础知识补充

内存分类

一、静态 / 全局内存(程序运行期间一直存在)

特点:全局变量和静态变量(用static声明)的内存,在程序启动时分配,程序结束才释放。
通俗理解:像「公共仓库」,一旦创建就一直存在,所有需要的地方都能访问(全局变量),或在特定范围内持续保留(静态变量)。

#include <stdio.h>

// 全局变量(属于静态/全局内存)
int global_var = 10;  

void show_static() {
    // 静态变量(属于静态/全局内存)
    static int static_var = 20;  
    static_var++;  // 每次调用都会保留上一次的值
    printf("静态变量: %d\n", static_var);
}

int main() {
    printf("全局变量初始值: %d\n", global_var);  // 输出10
    global_var = 100;  // 修改全局变量
    printf("修改后全局变量: %d\n", global_var);  // 输出100

    show_static();  // 第一次调用:静态变量=21
    show_static();  // 第二次调用:静态变量=22(值被保留)
    return 0;
}

解释

  • global_var是全局变量,整个程序都能访问,修改后值会一直保留。
  • static_var是函数内的静态变量,虽然在函数里声明,但不会因函数结束而消失,下次调用函数时会继续使用上次的值。

二、自动内存(栈内存,函数调用时临时创建)

特点:函数内的普通局部变量(不用static声明),内存由编译器自动分配 / 释放,函数调用时创建,函数返回时销毁。
通俗理解:像「临时储物柜」,只在函数执行期间使用,函数结束后里面的东西就被清空,下次再调用函数时会重新分配新的空间。

#include <stdio.h>

void temp_var_demo() {
    int temp = 100;  // 自动内存(栈内存)
    printf("函数内temp值: %d\n", temp);  // 输出100
}  // 函数结束,temp的内存被自动释放

int main() {
    temp_var_demo();  // 调用函数,temp被创建并使用
    // 下面这行代码会报错:temp是函数内的局部变量,main函数无法访问
    // printf("函数外temp值: %d\n", temp);  
    return 0;
}

解释

  • temptemp_var_demo函数内的局部变量,只在函数执行时存在。函数结束后,temp的内存会被自动回收,其他函数(如main)无法访问它。

三、动态内存(堆内存,手动分配和释放)

特点:通过malloc/calloc等函数手动申请内存,需用free手动释放(否则会内存泄漏)。内存生命周期由代码控制,不依赖函数调用。
通俗理解:像「自己租的仓库」,需要时自己申请(malloc),不用了自己退租(free),租期完全由你决定。

#include <stdio.h>
#include <stdlib.h>  // 包含malloc和free的函数声明

// 函数返回动态分配的内存地址
int* create_dynamic_memory(int size) {
    // 申请能存size个int的内存(每个int占4字节,共4*size字节)
    int* arr = (int*)malloc(size * sizeof(int));  
    if (arr == NULL) {  // 检查是否分配成功(内存不足时可能失败)
        printf("内存分配失败!\n");
        exit(1);  // 异常退出程序
    }
    // 初始化内存(比如全部设为0)
    for (int i = 0; i < size; i++) {
        arr[i] = i;
    }
    return arr;  // 返回内存地址(函数结束但内存不会被释放)
}

int main() {
    int* my_arr = create_dynamic_memory(5);  // 调用函数,获得动态内存

    // 使用内存(输出:0 1 2 3 4)
    for (int i = 0; i < 5; i++) {
        printf("%d ", my_arr[i]);
    }

    free(my_arr);  // 手动释放内存(必须!否则内存泄漏)
    my_arr = NULL;  // 避免“野指针”(指向已释放内存的指针)
    return 0;
}

解释

  • malloc申请的内存不会因函数(如create_dynamic_memory)结束而自动释放,必须用free手动释放。
  • 如果忘记free,这部分内存会一直被占用(内存泄漏),直到程序结束。

总结对比

内存类型分配方式释放方式生命周期典型用途
静态 / 全局内存程序启动时自动分配程序结束时自动释放程序运行全程全局状态、需要跨函数保留的值
自动内存(栈)函数调用时自动分配函数返回时自动释放函数执行期间临时计算的局部变量
动态内存(堆)手动调用malloc手动调用free释放手动控制(直到free需要灵活控制大小或跨函数使用的内存

四、知识点补充

本网站原创文章版权归何大锤的狂飙日记所有。发布者:何大锤,转转请注明出处:何大锤的博客

(0)
何大锤的头像何大锤管理团队

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

2211932694

在线咨询: QQ交谈

邮件:hdcblog1999@163.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
网站建设中ing......