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

如何获取C++中short*类型指向数组的实际长度?

解决方法

首先要明确:当你把数组thirdBuff赋值给指针_thirdNBuff时,数组会退化为指向首元素的指针,此时指针本身没有存储数组长度的信息,所以用sizeof(_thirdNBuff)只能得到指针的字节数,拿不到数组实际长度。下面是几种可行的解决思路:

1. 在结构体中额外存储数组长度

修改结构体,增加一个成员变量专门记录数组的长度,初始化时把数组长度计算好存进去:

struct ADDING_BYVAL
{
    #define THIRDNUMBER 100;

    short _firstNBuff[4];
    long _secondNVal;
    short* _thirdNBuff;
    size_t _thirdNBuffLen; // 新增:存储数组长度
    char* _pretext;
};

// 初始化时计算数组长度
short thirdBuff[] = {6, 7};
size_t thirdBuffLen = sizeof(thirdBuff) / sizeof(thirdBuff[0]);
char pret1[] = "pretextVal";
struct ADDING_BYVAL adding_byval = { 
    { 1,2,3,4 }, 
    5, 
    thirdBuff,
    thirdBuffLen,
    pret1
};

// 之后直接通过_thirdNBuffLen获取长度
// 比如:cout << adding_byval._thirdNBuffLen << endl;

2. 使用C++标准容器替代原生数组(推荐)

如果可以修改结构体的成员类型,用std::vector<short>代替short*,容器本身会维护长度信息,直接调用size()就能获取:

#include <vector>

struct ADDING_BYVAL
{
    #define THIRDNUMBER 100;

    short _firstNBuff[4];
    long _secondNVal;
    std::vector<short> _thirdNBuff; // 换成vector
    char* _pretext;
};

// 初始化时直接构造vector
char pret1[] = "pretextVal";
struct ADDING_BYVAL adding_byval = { 
    { 1,2,3,4 }, 
    5, 
    {6, 7}, // 直接初始化vector
    pret1
};

// 获取长度:adding_byval._thirdNBuff.size()

如果数组长度固定,也可以用std::array<short, 2>(需要知道编译期固定长度),同样可以通过size()获取长度。

3. 用特殊标记作为数组结束符(不推荐)

如果数组元素中有一个确定不会出现的“终止值”,比如假设你的short数组不会出现-1,可以遍历数组直到遇到这个值来计数:

// 假设数组最后加一个终止符
short thirdBuff[] = {6, 7, -1};
struct ADDING_BYVAL adding_byval = { 
    { 1,2,3,4 }, 
    5, 
    thirdBuff,
    pret1
};

// 遍历计数
size_t len = 0;
while (adding_byval._thirdNBuff[len] != -1) {
    len++;
}
// len就是数组长度(不含终止符)

这种方法局限性很大,只有当数组内容有明确的终止标记时才适用。


内容的提问来源于stack exchange,提问作者isswf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:27:30