C 语言动态内存管理:calloc、malloc 与 free 完全解析
本章讲解 C 语言动态内存管理。C 语言提供多个内存分配和管理函数,定义在 <stdlib.h> 头文件中。
| 序号 | 函数 & 说明 |
|---|---|
| 1 | void *calloc(int num, int size); 分配 num 个元素的数组,每个元素大小为 size 字节,并初始化为零。 |
| 2 | void free(void *address); 释放 address 指向的内存块。 |
| 3 | void *malloc(size_t size); 分配 size 字节内存,不初始化(内容不定)。 |
| 4 | void *realloc(void *address, int newsize); 将 address 指向的内存块重新调整大小至 newsize。 |
动态分配内存
编程时若明确数组大小,可直接定义数组。如存储人名,最长 100 字符:
char name[100];
但若无法预知所需文本长度(如存储详细描述),需定义字符指针,后根据需求动态分配:
Live Demo#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char name[100];
char *description;
strcpy(name, "Zara Ali");
/* 动态分配内存 */
description = malloc(200 * sizeof(char));
if (description == NULL) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcpy(description, "Zara ali a DPS student in class 10th");
}
printf("Name = %s\n", name);
printf("Description: %s\n", description);
}
编译执行输出:
Name = Zara Ali Description: Zara ali a DPS student in class 10th
同理可用 calloc(),只需替换 malloc:
calloc(200, sizeof(char));
动态分配让你完全控制内存大小,不像数组一旦定义大小不可更改。
调整与释放内存
程序结束时操作系统会自动释放所有程序分配的内存,但良好习惯是不再需要时主动调用 free() 释放。也可调用 realloc() 增减已分配内存块大小。下例演示 realloc() 与 free():
Live Demo#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char name[100];
char *description;
strcpy(name, "Zara Ali");
/* 动态分配内存 */
description = malloc(30 * sizeof(char));
if (description == NULL) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcpy(description, "Zara ali a DPS student.");
}
/* 需存储更大描述 */
description = realloc(description, 100 * sizeof(char));
if (description == NULL) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcat(description, "She is in class 10th");
}
printf("Name = %s\n", name);
printf("Description: %s\n", description);
/* 释放内存 */
free(description);
}
编译执行输出:
Name = Zara Ali Description: Zara ali a DPS student.She is in class 10th
若不重新分配额外内存,strcat() 会因 description 可用内存不足报错。
C语言
- 理解非机械数字存储器:SRAM、DRAM 与 Flash
- 理解 ROM、PROM、EPROM 与 EEPROM:设计、编程与识别
- 理解查找表:从 ROM 到高级 ALU
- 微处理器:存储程序计算的演进
- 2012年资产管理盛会:顶级会议、培训与展览
- 高效资产管理的四大核心目标
- 《维护管理权威指南》第 2 版:维护领导者的实战手册
- C++ 动态内存管理:new 与 delete 专家级实战指南
- C语言动态内存分配完全指南:malloc、calloc、realloc 与 free
- C++动态内存管理精要:栈与堆、new/delete、数组与对象分配实战
- Java 文档注释精通:Javadoc 工具与注释类型全解析
- Java 10 堆分配增强:支持 NV-DIMM 等替代内存设备