如何获取动态分配的二维数组的大小

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) * 6144sizeof(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 的微不足道的结果。

【讨论】:

以上是关于如何获取动态分配的二维数组的大小的主要内容,如果未能解决你的问题,请参考以下文章

C++ 如何从动态分配中获取数组大小?

如何使用 C++ 中的指针动态分配和解除分配二维数组?

二维对象数组 c 锐利的动态值分配

C++:使用函数为二维数组分配内存时出错

动态分配的二维数组

如何在一个分配 C 中动态分配二维数组