只有栈上静态二维数组可用 sizeof 求行列数:行数 = sizeof(arr)/sizeof(arr[0]),列数 = sizeof(arr[0])/sizeof(arr0);传参后退化为指针,sizeof 失效;动态分配或指针形式无法用 sizeof 获取尺寸。

用 sizeof 获取静态二维数组的行数和列数
只有对在栈上定义的静态二维数组(比如 int arr[3][4]),才能用 sizeof 算出行列数。编译器在编译期就知道它的完整内存布局,所以可以安全推导。
核心公式是:
行数 = sizeof(arr) / sizeof(arr[0])
列数 = sizeof(arr[0]) / sizeof(arr[0][0])
注意不能写成 sizeof(arr) / sizeof(int) —— 这虽然数值上可能碰巧对,但一旦数组类型变(比如换成 double 或自定义结构体),就立刻出错。
- 必须确保
arr是数组名本身,不是指针(传参后退化成指针就失效) -
arr[0]是第一行,类型是“含 N 个元素的数组”,sizeof(arr[0])得到的是整行字节数 - 如果数组声明为
int arr[][4] = {{1,2},{3,4}};,列数仍可由sizeof(arr[0]) / sizeof(int)得到,但行数必须靠初始化推断或额外变量记录
函数参数里传二维数组时,行数列数会丢失
当你把二维数组传进函数,比如 void f(int arr[3][4]),形参实际被当作 int (*)[4](指向含 4 个 int 的数组的指针)。此时 sizeof(arr) 返回的是指针大小(通常是 8),不再是整个数组大小。
这意味着:函数内部无法通过 sizeof 恢复原始行列数。
立即学习“C++免费学习笔记(深入)”;
- 常见错误写法:
sizeof(arr)/sizeof(arr[0])→ 结果是8 / 8 = 1,完全不对 - 正确做法:必须显式传入行数和列数,例如
void f(int arr[][4], int rows, int cols);或者改用std::vector<:vector>></:vector>配合.size() - 如果坚持用 C 风格数组且列数固定,可以只传行数,列数写死在函数签名里(如
int arr[][4]),但列数不能动态变化
动态分配的二维数组(new、malloc)根本没法用 sizeof 获取尺寸
像 int** arr = new int*[rows]; for(...) arr[i] = new int[cols]; 这种“不规则”堆分配,每行内存可能不连续,arr 只是指针,sizeof(arr) 永远是 8(64 位系统下指针大小)。
这种结构没有元信息存储行列数,运行时完全靠程序员自己记。
- 别试图用
sizeof去“猜”尺寸,它只会返回指针长度 - 更安全的做法是封装成结构体:
struct Matrix { int** data; int rows; int cols; };,把尺寸作为成员保存 - 现代 C++ 强烈建议用
std::vector<:vector>></:vector>或std::vector<int></int>+ 手动索引(data[i * cols + j]),前者支持vec.size()和vec[i].size(),后者只需存两个int
std::array 和 std::vector 怎么取行列数
std::array 是静态容器,类型包含维度信息,所以能直接用 .size();std::vector 是动态的,需要调用成员函数。
示例:
std::array<std::array<int, 5>, 3> arr1; // 3 行 5 列
std::cout << arr1.size() << "\n"; // 输出 3(外层数组大小)
std::cout << arr1[0].size() << "\n"; // 输出 5
<p>std::vector<std::vector<int>> vec = {{1,2,3}, {4,5}};
std::cout << vec.size() << "\n"; // 输出 2(行数)
std::cout << vec[0].size() << "\n"; // 输出 3(第一行列数)注意:vec 的各行长度可以不同(即“锯齿数组”),所以不能无条件用 vec[0].size() 代表所有行的列数。
真正需要规整二维结构时,更推荐单层 std::vector<int></int> 加行列参数,避免嵌套 vector 的内存碎片和额外开销。
最易忽略的一点:无论用哪种方式,只要数组生命周期结束或发生移动(如 vector realloc),原来保存的尺寸变量若没同步更新,就会变成悬空信息——尺寸必须和数据绑定管理,不能靠“当时算过一次就放心”。


















