Menu
CoddyTech

检查分配失败

本课属于 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 代码总会包含这些检查,以防止程序崩溃并妥善处理错误。

challenge icon

挑战

简单

编写一个 C 程序,演示使用 malloc() 进行动态内存分配时如何正确处理错误。你的程序应该:

  1. 从用户处读取一个整数 n,表示要存储的整数数量
  2. 使用 malloc() 和 sizeof() 为包含 n 个整数的数组动态分配内存
  3. 检查内存分配是否成功,方法是测试返回的指针是否为 NULL
  4. 如果分配失败,打印 Memory allocation failed! 并终止程序
  5. 如果分配成功,打印 Memory allocation successful!
  6. 从用户处读取 n 个整数值,并将它们存储在已分配的数组中
  7. 计算并打印所有值的总和,格式为:Sum: [value]
  8. 打印已分配的总字节数,格式为: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;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: C 在线编译器