如何获取动态分配的二维数组的大小
Posted
技术标签:
【中文标题】如何获取动态分配的二维数组的大小【英文标题】:How to get the size of dynamically allocated 2d array 【发布时间】:2012-09-20 00:38:15 【问题描述】:我已经动态分配了二维数组。 这是代码
int **arrofptr ;
arrofptr = (int **)malloc(sizeof(int *) * 2);
arrofptr[0] = (int *)malloc(sizeof(int)*6144);
arrofptr[1] = (int *)malloc(sizeof(int)*4800);
现在我必须知道在 arrofptr,arrofptr[0],arrofptr[1] 中分配了多少字节? 有什么办法知道大小吗?
如果我们要打印
sizeof(arrofptr);
sizeof(arrofptr[0]);
sizeof(arrofptr[1]);
然后它会打印 4.
【问题讨论】:
不,您只需要自己跟踪。 指针的大小通常是4
,这就是你得到4
的原因。分配的字节在malloc(...)
的参数中,在你的情况下这些是sizeof(int) * 6144
和sizeof(int) * 4800
... ... ...
这不是一个二维数组,它是一组分段数组,带有一个指针数组来跟踪它们。有关如何正确动态分配二维数组的信息,read this。另外,你应该never typecast the result of malloc。
【参考方案1】:
你找不到arrofptr
的大小,因为它只是一个指向指针的指针。您正在使用它定义一个数组数组。没有办法只用指针告诉size信息,需要自己维护size信息。
【讨论】:
【参考方案2】:您从malloc()
获得的唯一返回值是指向分配区域的第一个字节的指针(或NULL
失败时)。 no 是可移植的、标准的从这样的指针获取相关分配大小的方法,所以通常答案是 no。
C 方法通常用一对值来表示数组和缓冲区:基地址和大小。顺便说一下,后者通常是 size_t
类型,与 malloc()
的参数相同。
【讨论】:
【参考方案3】:如果您想跟踪已分配代码块的大小,则需要将该信息存储在您分配的内存块中,例如
// allocate 1000 ints plus one int to store size
int* p = malloc(1000*sizeof(int) + sizeof(int));
*p = (int)(1000*sizeof(int));
p += sizeof(int);
...
void foo(int *p)
if (p)
--p;
printf( "p size is %d bytes", *p );
替代。放入一个结构体
struct
int size;
int *array;
s;
【讨论】:
【参考方案4】:您无法在 C(二维或其他)中获取动态分配数组的长度。如果您需要该信息,请在最初分配内存时将其保存到变量(或至少一种计算方法)中,并将指向内存的指针和内存大小一起传递。
在您上面的测试用例中,sizeof 正在返回指针的大小,因此您的计算指针的大小通常为 4,这就是为什么您得到 4 并且很可能总是得到 4 的微不足道的结果。
【讨论】:
以上是关于如何获取动态分配的二维数组的大小的主要内容,如果未能解决你的问题,请参考以下文章