Menu
CoddyTech

使用 sizeof() 进行分配

本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 33 课,共 63 课。

虽然 malloc() 可以让你动态分配内存,但有一条重要的最佳实践能让代码更具可移植性,也更易于维护:使用 sizeof() 运算符确定要分配多少字节。

sizeof() 运算符会返回在你的系统上存储特定数据类型所需的字节数。你不必硬编码字节大小,可以让 sizeof() 自动计算正确的字节数:

// 不要猜测字节大小:
int *ptr = (int*)malloc(4);  // 假设 int 占 4 个字节

// 用 sizeof() 提高可移植性:
int *ptr = (int*)malloc(sizeof(int));  // 始终正确

分配数组时,这种方法尤其有用。要为多个元素分配空间,请将元素数量乘以每个元素的大小:

// 为 10 个整数分配空间
int *arr = (int*)malloc(10 * sizeof(int));

// 为 5 个 double 类型的值分配空间
double *values = (double*)malloc(5 * sizeof(double));

使用 sizeof() 可以确保代码在不同系统上都能正确运行,因为不同系统中的数据类型大小可能不同。它还能清楚地表达你的意图:为特定类型的指定数量元素分配空间。

challenge icon

挑战

简单

编写一个 C 程序,演示如何正确使用 sizeof() 和 malloc() 进行动态内存分配。程序应当:

  1. 从用户处读取一个整数 n,表示要分配的元素数量
  2. 使用 malloc() 和 sizeof(),为包含 n 个 double 值的数组动态分配内存
  3. 将返回的 void 指针转换为 double 指针
  4. 从用户处读取 n 个 double 值,并将它们存入已分配的数组中
  5. 计算分配的总内存大小(以字节为单位),并按以下格式打印:Memory allocated: [bytes] bytes
  6. 计算所有值的平均值,并按以下格式打印,保留 2 位小数:Average: [value]
  7. 找出最大值,并按以下格式打印,保留 2 位小数:Largest: [value]

记得包含 <stdlib.h> 头文件,以便使用 malloc()。你的程序应演示 sizeof() 如何确保无论系统的数据类型大小如何,都能正确分配内存。

例如,如果输入为:

3
2.5 7.8 4.1

输出应为:

Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80

这个挑战进一步说明了使用 sizeof() 的重要性,它能让动态内存分配更具可移植性,也更易于维护,并自动计算出在任何系统上为任意数据类型所需的正确字节数。

亲手试试

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 读取元素的数量
    int n;
    scanf("%d", &n);
    
    // TODO:在下方编写你的代码
    // 1. 使用 malloc() 和 sizeof() 为 n 个 double 值分配内存
    // 2. 将返回的指针转换为 double*
    // 3. 读取 n 个 double 值,并将它们存入已分配的数组
    // 4. 计算并输出分配的内存字节数
    // 5. 计算并输出平均值,保留 2 位小数
    // 6. 找出并输出最大值,保留 2 位小数
    
    return 0;
}
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: C 在线编译器