内存分类
一、静态 / 全局内存(程序运行期间一直存在)
特点:全局变量和静态变量(用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;
}
解释:
temp
是temp_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 ) | 需要灵活控制大小或跨函数使用的内存 |
四、知识点补充
本网站原创文章版权归何大锤的狂飙日记所有。发布者:何大锤,转转请注明出处:何大锤的博客