检查分配失败
本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 34 课,共 63 课。
虽然 malloc() 是动态内存分配的强大工具,但你必须了解一个关键事实:malloc() 可能会失败。系统没有可用内存时,malloc() 无法满足你的请求,会返回 NULL,而不是有效的内存地址。
这意味着,每次使用 malloc() 时,你都必须先检查它是否成功,然后才能尝试使用返回的指针。使用 NULL 指针会导致程序因段错误而崩溃。
int *ptr = (int*)malloc(sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return -1; // 退出程序或处理错误
}
// 这里可以安全地使用 ptr
*ptr = 42;这个 NULL 检查不是可选的,而是编写健壮 C 程序的关键。即使在现代系统中,内存分配失败的情况很少见,也仍然可能发生,尤其是在资源受限的环境中,或请求分配大量内存时。专业的 C 代码总会包含这些检查,以防止程序崩溃并妥善处理错误。
挑战
简单编写一个 C 程序,演示使用 malloc() 进行动态内存分配时如何正确处理错误。你的程序应该:
- 从用户处读取一个整数
n,表示要存储的整数数量 - 使用
malloc()和sizeof()为包含n个整数的数组动态分配内存 - 检查内存分配是否成功,方法是测试返回的指针是否为
NULL - 如果分配失败,打印
Memory allocation failed!并终止程序 - 如果分配成功,打印
Memory allocation successful! - 从用户处读取
n个整数值,并将它们存储在已分配的数组中 - 计算并打印所有值的总和,格式为:
Sum: [value] - 打印已分配的总字节数,格式为:
Bytes allocated: [value]
请记得包含 <stdlib.h> 头文件,以便使用 malloc()。你的程序必须展示一项重要做法:在尝试使用已分配的内存之前,先检查分配是否失败。
例如,如果输入是:
4
10 20 30 40你的输出应该是:
Memory allocation successful!
Sum: 100
Bytes allocated: 16这个挑战强调了使用动态内存分配时进行防御性编程的重要性,确保程序能够妥善处理潜在的内存分配失败,而不是意外崩溃。
亲手试试
#include <stdio.h>
#include <stdlib.h>
int main() {
// 读取整数的个数
int n;
scanf("%d", &n);
// TODO: 在这里编写你的代码
// 使用 malloc() 为 n 个整数分配内存
// 检查内存分配是否成功
// 处理成功和失败两种情况
// 读取并存储这些整数
// 计算整数的总和以及分配的字节数
return 0;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: C 在线编译器