题目

使用预处理宏 ARRAY_SIZE(arr) 在编译期安全计算栈数组中包含的元素个数。

输入格式:无键盘输入(程序内置固定大小的测试数组)。

输出格式:输出宏计算出的数组元素数量,末尾换行。

数据范围与约定:适用于静态/自动存储期的原生数组。

思路与算法

1. 经典容量宏定义
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))。用整个数组占用的总字节数除以单个元素的字节大小。

2. 适用边界与陷阱
该宏只在原生数组的定义作用域内有效!若将数组名作为形参传递给函数,数组名退化为指针,sizeof(arr) 将得到指针长度(4 或 8 字节),计算结果会出错。

完整程序

#include <stdio.h>

// 数组长度宏:数组总字节数除以首元素字节数
#define ARR_LEN(a) (sizeof(a) / sizeof((a)[0]))

int main(void)
{
    int a[] = {1, 2, 3, 4, 5};
    // %zu 打印 size_t 类型
    printf("%zu\n", ARR_LEN(a));
    return 0;
}

运行示例

输出:

5