如何获取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
相关产品推荐
相关产品推荐

