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

这篇具有很好参考价值的文章主要介绍了通过数组的指针获得数组个数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 

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

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测试的,大家都可以测试下,看有哪不足的地方请告诉我,谢谢!

文章来源地址https://www.toymoban.com/news/detail-710955.html

到了这里,关于通过数组的指针获得数组个数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 8.3 【C语言】通过指针引用数组

    所谓数组元素的指针就是数组元素的地址。 可以用一个指针变量指向一个数组元素。例如: int a[10]={1,3,5,7,9,11,13,15,17,19}; int *p; p=a[0]; 引用数组元素可以用下标法,也可以用指针法,即通过指向数组元素的指针找到所需的元素。 在指针已指向一个数组元素时,可以对指针进

    2024年02月12日
    浏览(45)
  • 写个简单的管理数组指针的智能指针

    模板智能数组指针 1.管理任意类型的数组指针 2.释放的时候自动删除数组指针指向的内存 3.通过指针计算数组中的个数   3.要有指针的样式和数组的样式 4.支持for范围查询和迭代器 5.实例用法  

    2024年02月08日
    浏览(51)
  • 【Rust】——通过Deref trait将智能指针当作常规引用处理

    💻博主现有专栏:                 C51单片机(STC89C516),c语言,c++,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux,基于HTML5的网页设计及应用,Rust(官方文档重点总结),jQuery,前端vue.js,Javaweb开发,Python机器学习等 🥏主页链接:     

    2024年04月26日
    浏览(37)
  • Elasticsearch:使用 count API 来获得所有文档的个数

    在我开始使用 Elasticsearch 的时候,我希望获得给定查询的文档总数。比如我们想对数据进行分页显示。从 Elasticsearch 7.0之后,为了提高搜索的性能,在 hits 字段中返回的文档数有时不是最精确的数值。Elasticsearch 限制了最多的数值为10000。我们知道 Search API 提供的计数不准确

    2024年02月15日
    浏览(35)
  • Web3 智能合约通过数组方式存储更多学生数据

    之前的文章 Web3 在Truffle项目中编写出自己的第一个solidity智能合约带大家写了一个相对捡漏的智能合约 这样 每次 我们set 后 都会将原来的数据覆盖掉了 那么 有些人可能会想 那我们弄个数组 将新的数据全部加到数组里不就行了吗? 这个想法其实就很不错 我们可以基于这个

    2024年02月15日
    浏览(58)
  • 【C++学习】智能指针

    🐱作者:一只大喵咪1201 🐱专栏:《C++学习》 🔥格言: 你只管努力,剩下的交给时间! 如上图代码所示,在Func中开辟动态空间,在调用完Division函数后释放该空间。 如果Division没有抛异常,那么动态空间会被正常释放。 如果Division抛了异常,就会去匹配对应的catch,而Fu

    2024年02月06日
    浏览(57)
  • c++ 学习系列 -- 智能指针

    C++ 程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。但使用普通指针,容易造成内存泄露(忘记释放)、二次释放、程序发生异常时内存泄露等问题等。 另外,使用普通指针容易产生 野指针、悬空指针 等问题。 所以 C++11 就引入了智能指

    2024年02月13日
    浏览(59)
  • rust学习-智能指针

    示例1 无意义的例子:将一个单独的值存放在堆上并不是很有意义,b更应该放到栈上 示例2-递归类型 一种无法在编译时知道大小的类型是 递归类型(recursive type) 其值的一部分可以是相同类型的另一个值 递归类型来源于Lisp语言:cons 函数(“construct function\\\" 的缩写)利用两

    2024年02月16日
    浏览(38)
  • C++智能指针学习——小谈引用计数

    目录 前言 控制块简介 共享控制块 引用计数与弱引用计数创建过程 __shared_ptr __shared_count _Sp_counted_base 弱引用计数增加过程 再谈共享控制块 __weak_count 引用计数增加过程 弱引用计数的减少过程 弱引用计数减为0 引用计数的减少过程 引用计数减为0 参考文章 本文结合源码讨论

    2024年04月08日
    浏览(49)
  • 【Rust】Rust学习 第十四章智能指针

    指针  ( pointer )是一个包含内存地址的变量的通用概念。这个地址引用,或 “指向”(points at)一些其他数据。Rust 中最常见的指针是第四章介绍的  引用 ( reference )。引用以   符号为标志并借用了他们所指向的值。除了引用数据没有任何其他特殊功能。它们也没有任

    2024年02月12日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包