乐闻世界logo
搜索文章和话题

How do malloc() and free() work?

5 个月前提问
4 个月前修改
浏览次数19

1个答案

1

malloc()free() 是 C 语言标准库中用来进行动态内存分配的两个非常基础的函数。下面我将详细解释这两个函数的工作原理,并给出一个相关的例子。

malloc() 函数

malloc() 函数用于在堆上动态分配指定大小的内存块。它的原型定义在 <stdlib.h> 头文件中,如下:

c
void* malloc(size_t size);

这里的 size_t size 是需要分配的内存大小(以字节为单位)。如果分配成功,malloc() 返回一个指向分配的内存块的指针。如果分配失败(例如内存不足),则返回 NULL

malloc() 只分配内存,不初始化内存。这意味着分配的内存的内容是未定义的。用户需要自己初始化这块内存。

free() 函数

free() 函数用于释放之前通过 malloc() 分配的内存。它的原型同样在 <stdlib.h> 中定义:

c
void free(void* ptr);

这里的 void* ptr 是指向之前通过 malloc() 分配的内存块的指针。free() 释放这块内存,使其可用于未来的分配。使用 free() 释放内存后,原指针变为悬挂指针,再次访问该指针将会是危险的。通常情况下,释放内存后将指针设置为 NULL 是一个好习惯。

示例

下面是一个使用 malloc()free() 的例子:

c
#include <stdlib.h> #include <stdio.h> int main() { int n = 5; // 分配内存以存储 5 个整数 int* arr = (int*) malloc(n * sizeof(int)); if (arr == NULL) { fprintf(stderr, "Memory allocation failed\n"); return 1; } // 初始化数组 for (int i = 0; i < n; i++) { arr[i] = i; } // 输出数组 for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); // 释放内存 free(arr); arr = NULL; // 避免悬挂指针 return 0; }

在这个例子中,我首先用 malloc() 分配了足够的内存来存储 5 个整数。然后,我通过遍历数组来初始化这些整数,接着输出他们。最后,我使用 free() 释放了这块内存,并将指针设置为 NULL 以避免悬挂指针的问题。

通过这种方式,malloc()free() 可以帮助管理 C 程序中的动态内存,使得内存使用更加灵活高效。

2024年6月29日 12:07 回复

你的答案