malloc
是C语言标准库中用于动态内存分配的重要函数,它定义在<stdlib.h>
头文件中。
函数原型
void *malloc(size_t size);
参数说明
size
:要分配的内存块的大小,以字节为单位
返回值
- 成功时:返回指向分配内存块的指针
- 失败时:返回NULL指针
基本用法
#include <stdio.h>
#include <stdlib.h>
int main() {
// 分配可以存储10个int的内存空间
int *arr = (int *)malloc(10 * sizeof(int));
if (arr == NULL) {
printf("内存分配失败\n");
return 1;
}
// 使用分配的内存
for (int i = 0; i < 10; i++) {
arr[i] = i * 2;
}
// 打印数组内容
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 释放内存
free(arr);
return 0;
}
重要特性
- 内存来源:从堆(heap)区域分配内存
- 初始化:分配的内存不会被初始化,内容是未定义的
- 内存对齐:返回的指针保证适合任何数据类型的对齐要求
- 大小限制:可以分配非常大的内存块(取决于系统)
使用注意事项
检查返回值:总是检查malloc是否返回NULL
int *ptr = malloc(size);
if (ptr == NULL) {
// 处理内存分配失败
}
类型转换:在C中不需要显式类型转换,但在C++中需要
// C语言中
int *ptr = malloc(10 * sizeof(int));
// C++中需要
int *ptr = (int *)malloc(10 * sizeof(int));
计算大小:使用sizeof运算符计算类型大小
// 好
struct Student *s = malloc(sizeof(struct Student));
// 更好
struct Student *s = malloc(sizeof *s);
内存释放:使用free释放分配的内存
free(ptr);
ptr = NULL; // 避免悬垂指针
相关函数
calloc:分配并清零内存
int *arr = calloc(10, sizeof(int)); // 分配并初始化为0
realloc:调整已分配内存块的大小
arr = realloc(arr, 20 * sizeof(int)); // 扩大数组
free:释放分配的内存
free(arr);
常见错误
内存泄漏:分配后忘记释放
void func() {
char *str = malloc(100);
// 忘记free(str)
}
使用未初始化内存:malloc不初始化内存
int *nums = malloc(10 * sizeof(int));
printf("%d", nums[0]); // 未定义行为
访问已释放内存:
int *ptr = malloc(sizeof(int));
free(ptr);
*ptr = 10; // 未定义行为
忘记检查NULL:
int *big = malloc(10000000000); // 可能失败
*big = 1; // 如果malloc失败会崩溃
最佳实践
- 总是检查malloc的返回值
- 为指针变量使用有意义的名称
- 释放内存后将指针设为NULL
- 考虑使用calloc代替malloc+memset
- 对于复杂数据结构,考虑编写专门的创建/销毁函数
实际应用示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *name;
int age;
} Person;
Person *create_person(const char *name, int age) {
Person *p = malloc(sizeof(Person));
if (!p) return NULL;
p->name = malloc(strlen(name) + 1);
if (!p->name) {
free(p);
return NULL;
}
strcpy(p->name, name);
p->age = age;
return p;
}
void destroy_person(Person *p) {
if (p) {
free(p->name);
free(p);
}
}
int main() {
Person *person = create_person("Alice", 30);
if (person) {
printf("Name: %s, Age: %d\n", person->name, person->age);
destroy_person(person);
}
return 0;
}
malloc是C语言动态内存管理的核心函数,正确使用它对于编写健壮、高效的C程序至关重要