vector数组行数计算异常:为何结果为0?如何正确获取?
问题分析与解决方案
嘿,我来帮你拆解下这个问题,为什么你的代码输出是0,以及怎么正确获取这个“行数”~
为什么输出是0?
你这里踩了一个C++里很容易犯的坑:mat是指针,不是真正的数组。
当你用new vector<float>[p]创建动态数组时,返回的是指向第一个vector<float>元素的指针(类型是vector<float>*)。这时候:
sizeof(mat)得到的是指针本身的字节数(在64位系统下通常是8字节)。sizeof(mat[0])是单个vector<float>对象的大小(vector内部一般包含3个指针,64位下是24字节左右)。- 用8除以24做整数除法,结果自然是0,这就是你看到的输出。
C++的动态数组不会自动保存自身的长度信息,所以靠sizeof计算行数完全行不通。
正确的解决方法
有几种靠谱的方式可以获取你要的“行数”:
1. 直接复用已有的变量p
既然你创建数组时已经用了p=7,那直接输出p就可以得到行数,这是最简单直接的方法:
int main() { int i,p=7; vector<float> *mat=new vector<float>[p]; int k=5; for(i=0;i<p;i++){ mat[i].assign(k,0); } cout << p << endl; // 直接输出7 return 0; }
2. 改用嵌套vector(推荐)
这是更符合现代C++风格的做法,嵌套的vector<vector<float>>会自动管理自身的大小,你可以直接用size()方法获取行数:
int main() { int p=7; int k=5; // 直接创建p行、每行k个0的二维vector vector<vector<float>> mat(p, vector<float>(k, 0)); cout << mat.size() << endl; // 输出7 return 0; }
这种方式不需要手动管理内存(不用写delete[]),还能随时调整行数/列数,安全性和易用性都更高。
3. 手动维护长度(不推荐)
如果你一定要坚持用动态分配的数组,那必须自己保存长度值(就像你已经定义的p)——因为C++不会为动态数组存储长度信息,任何试图通过指针推导长度的方式都是不可靠的。
内容的提问来源于stack exchange,提问作者Rangerix
相关产品推荐
相关产品推荐

