如何编写可自主获取二维数组行数的函数
二维静态数组行数计算实现方案
前置说明
该方案仅适用于编译期确定大小的静态分配二维数组,动态申请(malloc/new)的二维数组无法通过数组本身直接计算行数,需自行维护长度变量传递。
两种主流实现方式
1. C++ 模板实现(类型安全,推荐)
利用模板编译期自动推导数组维度的特性,不需要额外传参,不会出现数组退化成指针导致的计算错误:
template <typename T, size_t ROW, size_t COL> size_t get_2d_array_rows(T (&arr)[ROW][COL]) { return ROW; }
调用示例:
#include <iostream> int main() { char arr[5][5]; std::cout << "行数:" << get_2d_array_rows(arr) << std::endl; // 输出5 return 0; }
2. C 语言宏实现
C语言没有模板特性,可通过宏计算总大小和单行大小的比值得到行数:
#define GET_2D_ARRAY_ROWS(arr) (sizeof(arr) / sizeof(arr[0]))
调用示例:
#include <stdio.h> int main() { char arr[5][5]; printf("行数:%zu\n", GET_2D_ARRAY_ROWS(arr)); // 输出5 return 0; }
注意:该宏只能在数组声明的同作用域使用,如果数组被退化为指针传入其他函数,
sizeof(arr)会得到指针的大小(64位系统下为8字节),计算结果会出错。
常见踩坑提醒
- 函数形参写为
char arr[5][5]时,实际会被编译器退化为char (*arr)[5]类型的指针,在该函数内无法直接计算数组行数 - 指针形式的动态二维数组(如
char **arr)无法用上述方法计算行数,需单独维护行数变量传递
内容的提问来源于stack exchange,提问作者LordObnoxious
相关产品推荐
相关产品推荐

