首页 > 其他分享 >通过数组的指针获得数组个数

通过数组的指针获得数组个数

时间:2023-10-22 09:05:38浏览次数:32  
标签:int 个数 GetSize 数组 pAry 指针

 

这几天学习智能指针时,自己在练习写个管理数组指针的类时碰到了通过数组指针获取数组个数的问题

1.在网上查询了通过数组指针获取数组个数的方法,对于自定义数据在前四个节点保存了数组个数

Student* pAry = new Student[3];

size_t num = *((size_t*)pAry - 1);//3

 


测试是成功的,但是是对于内置数据类型int,double,char等就不成功了

2.又晕菜了,又在网上查找,最后获得了_msize()这么个函数,获取New出来的内置数据在堆中的内存块大小,不由就眼前一亮,有内存大小还愁不知道数组个数?

template<typename T>
void GetSize(T* pArray)
{
int s= _msize(pArray) / sizeof(T);
}

//测试int
int *pAry = new int[5];
GetSize(pAry);//获得5个

//char
char *pAry = new char[11];
GetSize(pAry);//获得11

//union 这个要注意不能包括对象,可以是对象指针
MyUnion *pAry = new MyUnion[11];
GetSize(pAry);//获得11

这也成功了,反正是内置的数据类型都可以计算出来,

总结一下,
1.内置数据类型用_msize()能获得数组在堆中的内存大小,再通过计算获得数组个数,
注意的是共用体中不能包括对象,不然出错,可以是对象指针

2.关于自定义类型数组,就要用获取对象数组的指针前四个字节来获取数组个数
自定义类型不就是.struct 结构体,class 类,union 共用体吗,除掉共用体就只有二个,

所以,最后的函数写成如下.

template<typename T>
int GetSize(T* pArray)
{
const char* pname = typeid(T).name(); //获得类型名称
int s = 0;

//检查是否是结构体sturct 或是类class
if (strstr(pname, "struct") || strstr(pname, "class")) 
{
s = *((size_t*)pArray - 1); //获取对象数组个数
}
else
{
s = _msize(pArray) / sizeof(T); //获取内置数据数组个数
}
return s;
}

 

测试最后都能获得正确的数组个数

我在windows上用vs2017测试的,大家都可以测试下,看有哪不足的地方请告诉我,谢谢!

标签:int,个数,GetSize,数组,pAry,指针
From: https://www.cnblogs.com/greenleaf1976/p/17779857.html

相关文章

  • 写个简单的管理数组指针的智能指针
    模板智能数组指针1.管理任意类型的数组指针2.释放的时候自动删除数组指针指向的内存//模板智能数组指针template<typenameT>classAiArrayPtr{public:AiArrayPtr(T*pArray){m_pAiPtr=pArray;m_bIsMyPtr=true;//是自己管理的指针......
  • Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法
    Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,此处测试代码如下,这里使用add方法:1publicclassmain{2publicstaticvoidmain(String[]args){3int[]num={1,2,3};4Listlist=Arrays.asList(num);5list.add(4);......
  • c++指针相关
    常量指针(PointertoConstant)定义:一个指向常量的指针。这意味着指针指向的值不能被修改,但指针本身可以被修改,即可以重新指向其他地址。声明:constType*pointerName;constint*p1;intx=10,y=20;p1=&x;//Valid*p1=50;//Errorp1=&y;//Valid指针......
  • 无涯教程-AWK - 数组(Array)
    AWK具有关联数组,您可以使用字符串或数字作为数组索引。array_name[index]=value其中array_name是数组的名称,index是数组的索引,而value是分配给数组元素的任何值。创建数组为了获得更多关于数组的见解,让我们创建和访问数组的元素。[Learnfk]$awk'BEGIN{fruits["m......
  • 26. 删除有序数组中的重复项
    给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:更改数组nums......
  • 80. 删除有序数组中的重复项 II
    给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。示例1:输入:nums=[1,1,1,2,2,3]输出:5,nums=[1,1,2,2,3]......
  • 慎用智能指针的reset方法
    背景使用智能指针指向class的成员变量会导致指针Segmentationfault.复现直接看代码https://godbolt.org/z/Tnx45jraP#include<iostream>#include<memory>structHandler{intnum=7;};intmain(){Handlerhandler;std::shared_ptr<int>ptr=null......
  • map遍历数组返回包含所需字段的对象
    假如dataList为后台假数据,我想分别得到number和chargeTime、number和freeTime,来分别画图,就可以这么写,当然直接for循环更可以。1constdataList={2list:[3{4number:"0",5chargeTime:2,6freeTime:57......
  • 运用模板重载二维数组
    #include<iostream>#include<array>usingnamespacestd;//stack.htemplate<typenameT>classArray{public: Array(introw,intcol); T*operator[](introw);public: T*m_pT; intm_Row; intm_Col;};template<typenameT>Ar......
  • javascript: 合并数组
     <!doctypehtml><html><head><metacharset="utf-8"><metaname="viewport"content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no"><metahttp-eq......