使用 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() 可以确保代码在不同系统上都能正确运行,因为不同系统中的数据类型大小可能不同。它还能清楚地表达你的意图:为特定类型的指定数量元素分配空间。
挑战
简单编写一个 C 程序,演示如何正确使用 sizeof() 和 malloc() 进行动态内存分配。程序应当:
- 从用户处读取一个整数
n,表示要分配的元素数量 - 使用
malloc()和sizeof(),为包含n个 double 值的数组动态分配内存 - 将返回的 void 指针转换为 double 指针
- 从用户处读取
n个 double 值,并将它们存入已分配的数组中 - 计算分配的总内存大小(以字节为单位),并按以下格式打印:
Memory allocated: [bytes] bytes - 计算所有值的平均值,并按以下格式打印,保留 2 位小数:
Average: [value] - 找出最大值,并按以下格式打印,保留 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;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: C 在线编译器