目录
文章目录
前文列表
《程序编译流程与 GCC 编译器》
《C 语言编程 — 基本语法》
《C 语言编程 — 基本数据类型》
《C 语言编程 — 变量与常量》
《C 语言编程 — 运算符》
《C 语言编程 — 逻辑控制语句》
《C 语言编程 — 函数》
《C 语言编程 — 高级数据类型 — 指针》
《C 语言编程 — 高级数据类型 — 数组》
《C 语言编程 — 高级数据类型 — 枚举》
《C 语言编程 — 高级数据类型 — 结构体与位域》
《C 语言编程 — 高级数据类型 — 共用体》
《C 语言编程 — 数据类型的别名》
《C 语言编程 — 数据类型转换》
《C 语言编程 — 预处理器指令》
《C 语言编程 — 异常处理》
《C 语言编程 — 输入/输出与文件操作》
内存管理
C 语言为内存的分配和管理提供了几个标准函数。这些函数可以在 stdlib.h 头文件中找到。
注:void *
类型表示未确定类型的指针。C、C++ 规定 void *
类型可以通过强制类型转换为任何其它类型的指针。
动态分配内存
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char name[100];
/* 定义字符指针类型变量 */
char *description;
strcpy(name, "Zara Ali");
/*
分配内存,内存大小为 200 个字符长度(8 Bit)。
函数调用返回内存的指针(地址)并强制类型转换为字符指针类型。
*/
description = (char *)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);
return 0;
}
运行:
$ ./main
Name = Zara Ali
Description: Zara ali a DPS student in class 10th
上面的程序也可以使用 calloc()
函数来编写,只需要把 malloc 替换为 calloc 即可:
calloc(200, sizeof(char));
当动态分配内存时,程序有完全控制权,可以传递任何大小的值。不同的是,那些预先定义了大小的数组,一旦定义则无法改变大小。
重新调整内存的大小和释放内存
当程序退出时,操作系统会自动释放所有分配给程序的内存,但是主动释放内存是一个良好的编程习惯。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char name[100];
char *description;
strcpy(name, "Zara Ali");
/*
分配内存,内存大小为 200 个字符长度(8 Bit)。
函数调用返回内存的指针(地址)并强制类型转换为字符指针类型。
*/
description = (char *)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\n");
}
/*
扩展分配内存,内存大小为 100 个字符长度(8 Bit)。
函数调用返回内存的指针(地址)并强制类型转换为字符指针类型。
*/
description = (char *)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\n");
}
printf("Name = %s\n", name);
printf("Description: %s\n", description);
/* 释放内存 */
free(description);
return 0;
}
运行:
$ ./main
Name = Zara Ali
Description: Zara ali a DPS student in class 10th
She is in class 10th