在C语言中,动态内存分配通常使用 `malloc`、`calloc`、`realloc` 和 `free` 函数,这些函数的标准头文件是 `stdlib.h`(而非 `malloc.h`)。虽然某些旧的体系(如Linux)可能提供 `malloc.h`,但现代C标准库(如C89/C99及更高版本)已将其合并到 `stdlib.h` 中。
核心函数解析(位于 “)
1. `malloc`
void malloc(size_t size);
int arr = (int) malloc(5 sizeof(int)); // 分配5个整型空间
2. `calloc`
void calloc(size_t num, size_t size);
int arr = (int) calloc(5, sizeof(int)); // 分配5个int,值全为0
3. `realloc`
void realloc(void ptr, size_t new_size);
arr = (int) realloc(arr, 10 sizeof(int)); // 扩大为10个int
4. `free`
void free(void ptr);
使用示例
include
include // 动态内存分配标准头文件
int main
// 分配内存
int arr = (int) malloc(3 sizeof(int));
if (arr == NULL)
perror(“malloc failed”);
return 1;
// 初始化数据
for (int i = 0; i < 3; i++)
arr[i] = i 10;
// 扩容内存
int new_arr = (int) realloc(arr, 5 sizeof(int));
if (new_arr == NULL)
free(arr); // 扩容失败时释放原内存
perror(“realloc failed”);
return 1;
arr = new_arr; // 更新指针
arr[3] = 30;
arr[4] = 40;
// 释放内存
free(arr);
arr = NULL; // 避免野指针
return 0;
关键注意事项
1. 检查返回值:`malloc`/`calloc`/`realloc` 可能失败,需检查返回是否为 `NULL`。
2. 内存泄漏:分配后未释放会导致内存泄漏。
void leak_example
int ptr = malloc(sizeof(int));
// 忘记 free(ptr)!
3. 野指针:释放后继续访问指针,或未初始化就解引用。
int p = malloc(sizeof(int));
free(p);
p = 42; // 错误!p已是野指针
4. 类型转换:C中 `malloc` 返回 `void` 可隐式转换,但C++要求显式转换(如 `(int)malloc(…)`)。
5. 初始化:`malloc` 不初始化内存,`calloc` 初始化为0。
为什么避免使用 `malloc.h`
替代方案(C++)
在C++中,优先使用 `new` 和 `delete` 替代C风格内存管理:
cpp
int arr = new int[5]; // 分配
delete[] arr; // 释放
拓展资料:
避免内存泄漏和野指针