You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:17:46