核心答案
malloc 函数定义在 <stdlib.h> 头文件中。

(图片来源网络,侵删)
在你的 C 语言程序中使用 malloc,必须在文件开头包含这个头文件:
#include <stdlib.h>
详细解释
为什么是 <stdlib.h>?
<stdlib.h> 是 C 标准库中一个非常重要的头文件,它的名字是 "standard library"(标准库)的缩写,它包含了各种标准库函数的声明,这些函数通常与内存管理、程序控制、数字转换、随机数等有关。
malloc 函数的全称是 memory allocation(内存分配),它的作用是在程序的堆上动态地分配一块指定大小的内存空间,因为它是一个核心的内存管理函数,所以被包含在 <stdlib.h> 中。
malloc 的基本用法
malloc 的原型如下:

(图片来源网络,侵删)
void *malloc(size_t size);
-
参数:
size_t size: 你想要分配的内存大小,以字节为单位。size_t是一个无符号整数类型,专门用于表示大小和计数。
-
返回值:
- 成功时: 返回一个
void*类型的指针,指向分配好的内存块的起始地址。 - 失败时: 如果无法分配请求的内存(内存不足),
malloc会返回NULL指针。
- 成功时: 返回一个
-
*`void` 指针**:
void*是一个“通用指针”,它可以指向任何类型的数据,你不能直接对void*指针进行解引用(如*ptr)或指针算术,因为它不知道要操作的数据类型是什么。- 在使用
malloc后,几乎总是需要将返回的void*指针强制类型转换为你需要的具体类型的指针。
完整示例代码
下面是一个完整的示例,展示了如何包含头文件、使用 malloc、检查返回值、使用内存以及最后释放内存。
#include <stdio.h> // 用于 printf
#include <stdlib.h> // 用于 malloc 和 free
int main() {
int n;
int *ptr; // 声明一个整型指针
printf("请输入要分配的整数个数: ");
scanf("%d", &n);
// 1. 使用 malloc 分配内存
// sizeof(int) * n 计算需要的总字节数
// (int*) 将 void* 强制转换为 int*
ptr = (int*) malloc(n * sizeof(int));
// 2. 检查 malloc 是否成功
if (ptr == NULL) {
printf("内存分配失败!\n");
return 1; // 返回非零值表示程序异常终止
}
printf("内存分配成功!\n");
// 3. 使用分配的内存
for (int i = 0; i < n; i++) {
ptr[i] = i + 1; // 像使用普通数组一样使用指针
}
printf("分配的数组内容是: ");
for (int i = 0; i < n; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
// 4. 释放内存 (非常重要!)
// 使用完动态分配的内存后,必须使用 free 将其归还给系统
free(ptr);
// 为了防止悬垂指针,最好将指针设为 NULL
ptr = NULL;
printf("内存已释放,\n");
return 0;
}
与 malloc 相关的重要函数
malloc 通常与以下函数一起使用,它们也都在 <stdlib.h> 中声明:
-
*`free(void ptr)`**:
- 释放由
malloc、calloc或realloc分配的内存。 - 非常重要:不释放动态分配的内存会导致内存泄漏,即程序占用的内存越来越多,最终可能导致程序崩溃或系统变慢。
- 释放由
-
calloc(size_t num, size_t size):- 也用于动态分配内存。
calloc会将分配的内存块中的所有位都初始化为 0。malloc不会对分配的内存进行任何初始化,其内容是未知的(“垃圾值”)。
-
*`realloc(void ptr, size_t new_size)`**:
- 用于调整一个已经分配的内存块的大小。
ptr是之前由malloc或calloc返回的指针。new_size是你希望的新大小。- 它可能会在内存中移动你的数据块,并返回一个新的指针,你应该使用
realloc的返回值来更新你的指针变量。
| 函数名 | 头文件 | 功能 | 是否初始化内存 |
|---|---|---|---|
malloc |
<stdlib.h> |
分配指定字节数的内存 | 否 |
calloc |
<stdlib.h> |
分配指定数量和大小的内存块,并初始化为0 | 是 |
realloc |
<stdlib.h> |
调整已分配内存块的大小 | 否(但保留原有数据) |
free |
<stdlib.h> |
释放由上述函数分配的内存 | - |
记住这个核心原则:谁分配,谁释放,使用 malloc 分配的内存,最终必须用 free 释放。
