内存管理 (Memory Management)
C 语言中,内存管理分为自动分配和手动分配。
内存布局
- 代码段 (.text):存储程序的机器代码。
- 数据段 (.data):存储已初始化的全局变量和静态变量。
- BSS 段:存储未初始化的全局变量。
- 堆 (Heap):用于程序运行时的动态内存分配。
- 栈 (Stack):用于函数调用的参数传递、返回地址和局部变量。
栈与堆的区别
- 栈:自动分配,自动释放,速度快,空间有限。
- 堆:手动分配,手动释放,空间大,速度相对较慢。
动态内存分配
在 stdlib.h 中提供:
malloc(size_t size):分配指定字节的内存,返回void*。free(void *ptr):释放已分配的内存。calloc(size_t num, size_t size):分配内存并初始化为零。realloc(void *ptr, size_t new_size):重新调整内存大小。
int *p = (int*)malloc(sizeof(int) * 10);
if (p == NULL) { /* 处理分配失败 */ }
free(p); // 必须释放,防止内存泄漏
内存泄漏 (Memory Leak)
分配了内存但没有在合适的时机释放。
- 长期运行可能导致系统内存耗尽。
- 工具:
Valgrind用于检测内存泄漏。