如何获取动态分配的2d数组的大小

时间:2012-09-28 06:30:44

标签: c arrays 2d sizeof dynamic-allocation

我已动态分配2D数组。 这是代码

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 个答案:

答案 0 :(得分:2)

您找不到arrofptr的大小,因为它只是指向指针的指针。您正在使用它定义一个数组数组。只用指针无法告诉尺寸信息,您需要自己维护尺寸信息。

答案 1 :(得分:1)

malloc()获得的唯一返回值是指向已分配区域的第一个字节的指针(或失败时为NULL)。 没有可移植,标准,从这样的指针获取相关分配大小的方法,因此通常答案是 no

C方式通常用一对值表示数组和缓冲区:基址和大小。后者通常属于size_t类型,顺便提一下,与malloc()的参数相同。

答案 2 :(得分:1)

如果你想跟踪分配的代码块的大小,你需要将这些信息存储在你分配的内存块中。

// 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 );
  }
}

ALT。放入结构

struct
{
  int size;
  int *array;
} s;

答案 3 :(得分:0)

您无法获得C(2D或其他)中动态分配的数组的长度。如果您需要该信息,请在最初分配内存时将其保存到变量(或至少计算它的方式),并将指针传递给内存和内存的大小。

在你的测试用例中,sizeof返回指针的大小,因此你的计算指针的大小通常为4,这就是为什么你得到4并且很可能得到4的总结果。< / p>