动态申请的内存空间,如何由指针获取其长度?

时间:2022-07-29 04:29:59
例如:
#include <windows.h>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
int* p;
p = (int*)malloc(10*sizeof(int));  //动态申请了10个int的空间
cout<<p<<endl;
for(int i = 0; i < 8; i++)
*(p+i) = rand(); //随机填上数
for(int i = 0; i < 10; i++)
cout<<*(p+i)<<endl;

int* pDisturb = (int*)malloc(10*sizeof(int)); //加一个干扰
p = (int*)realloc(p,20*sizeof(int)); //重申请的时候 地址就变了
cout<<endl<<p<<endl;
for(int i = 0; i < 10; i++)
cout<<*(p+i)<<endl; //然而内容并没有变,原来的10个数被拷贝过来了

 // 【问题来了】它怎么知道我申请了10个空间的?
 //  我用什么函数才能得到这个长度:10?
system("pause");
return 0;
}


动态申请的内存空间,如何由指针获取其长度?

11 个解决方案

#1


     // 【问题来了】它怎么知道我申请了10个空间的?
调用malloc的时候,操作系统会给分配空间。他当然要记得你申请了多少,因为这部分空间不能给别人再用了,直到你调用free。

     //  我用什么函数才能得到这个长度:10?
据我所知,没办法。这个长度是系统自己使用的,作为用户没有函数能得到。如果要用,只能从申请的时候就一直保留下来。

#2


我没有学习过Windows的C++,但是获取空间大小的话不是用sizeof吗?

#3


同一楼,恐怕只能自己保存。

#4


引用 2 楼 蓝色祈祷的回复:
我没有学习过Windows的C++,但是获取空间大小的话不是用sizeof吗?

sizeof一个指针,得到的值只是指针长度,一般是4

#5


有一种实现是在申请的指针的前一个位置添加大小计数

但是你不应该这么思考,就是应该记下来

#6


可以用vc的内存工具看,你可以看到一些有趣的东西

#7


没有办法获得,只有自己保存好申请时的大小,把这个变量之后传给其他函数,C++里处理数组的函数通常要传入数组的指针与数组的大小两个参数,这一点和C#等不同。

#8


你申请的时候,系统是记录了的,可能会在你申请的内存前面记录一下,但是程序不能依赖这样的假定。

#9


int* p;
int size = 10;
p = (int*)malloc(size*sizeof(int));

同其他楼

#10


引用 1 楼 *mill 的回复:
     // 【问题来了】它怎么知道我申请了10个空间的?
调用malloc的时候,操作系统会给分配空间。他当然要记得你申请了多少,因为这部分空间不能给别人再用了,直到你调用free。

     //  我用什么函数才能得到这个长度:10?
据我所知,没办法。这个长度是系统自己使用的,作为用户没有函数能得到。如果要用,只能从申请的时候就一直保留下来。

谢谢一楼和楼下各位
因为经常要动态申请内存,当要存更多的数据大于之前申请的空间时,要realloc扩大内存空间,这时候就要查询之前申请了多大内存
我觉得这是个很常用的东西啊?为什么c就没有捏

#11


写个结构自己保存吧

#1


     // 【问题来了】它怎么知道我申请了10个空间的?
调用malloc的时候,操作系统会给分配空间。他当然要记得你申请了多少,因为这部分空间不能给别人再用了,直到你调用free。

     //  我用什么函数才能得到这个长度:10?
据我所知,没办法。这个长度是系统自己使用的,作为用户没有函数能得到。如果要用,只能从申请的时候就一直保留下来。

#2


我没有学习过Windows的C++,但是获取空间大小的话不是用sizeof吗?

#3


同一楼,恐怕只能自己保存。

#4


引用 2 楼 蓝色祈祷的回复:
我没有学习过Windows的C++,但是获取空间大小的话不是用sizeof吗?

sizeof一个指针,得到的值只是指针长度,一般是4

#5


有一种实现是在申请的指针的前一个位置添加大小计数

但是你不应该这么思考,就是应该记下来

#6


可以用vc的内存工具看,你可以看到一些有趣的东西

#7


没有办法获得,只有自己保存好申请时的大小,把这个变量之后传给其他函数,C++里处理数组的函数通常要传入数组的指针与数组的大小两个参数,这一点和C#等不同。

#8


你申请的时候,系统是记录了的,可能会在你申请的内存前面记录一下,但是程序不能依赖这样的假定。

#9


int* p;
int size = 10;
p = (int*)malloc(size*sizeof(int));

同其他楼

#10


引用 1 楼 *mill 的回复:
     // 【问题来了】它怎么知道我申请了10个空间的?
调用malloc的时候,操作系统会给分配空间。他当然要记得你申请了多少,因为这部分空间不能给别人再用了,直到你调用free。

     //  我用什么函数才能得到这个长度:10?
据我所知,没办法。这个长度是系统自己使用的,作为用户没有函数能得到。如果要用,只能从申请的时候就一直保留下来。

谢谢一楼和楼下各位
因为经常要动态申请内存,当要存更多的数据大于之前申请的空间时,要realloc扩大内存空间,这时候就要查询之前申请了多大内存
我觉得这是个很常用的东西啊?为什么c就没有捏

#11


写个结构自己保存吧