亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

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语言

  1. 理解非机械数字存储器:SRAM、DRAM 与 Flash
  2. 理解 ROM、PROM、EPROM 与 EEPROM:设计、编程与识别
  3. 理解查找表:从 ROM 到高级 ALU
  4. 微处理器:存储程序计算的演进
  5. 2012年资产管理盛会:顶级会议、培训与展览
  6. 高效资产管理的四大核心目标
  7. 《维护管理权威指南》第 2 版:维护领导者的实战手册
  8. C++ 动态内存管理:new 与 delete 专家级实战指南
  9. C语言动态内存分配完全指南:malloc、calloc、realloc 与 free
  10. C++动态内存管理精要:栈与堆、new/delete、数组与对象分配实战
  11. Java 文档注释精通:Javadoc 工具与注释类型全解析
  12. Java 10 堆分配增强:支持 NV-DIMM 等替代内存设备