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

C 如何获取动态分配的2d数组的大小,c,arrays,2d,sizeof,dynamic-allocation,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]中分配了多少字节? 有没有办法知道尺寸 如果我们要打印 sizeo

我已经动态分配了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。

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

malloc()
获得的唯一返回值是指向所分配区域的第一个字节的指针(或
NULL
)。没有可移植的、标准的方法从这样一个指针获取相关的分配大小,所以一般来说答案是否定的


C方式通常用一对值表示数组和缓冲区:一个基址和一个大小。后者的类型通常为
size\t
,与
malloc()
的参数相同。

如果要跟踪已分配代码块的大小,则需要将该信息存储在分配的内存块中,例如

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

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


在sizeof以上的测试用例中,返回指针的大小,因此您的计算中指针的大小通常为4,这就是为什么您得到4,并且很可能总是得到微不足道的结果4。

否-您只需自己跟踪即可。指针的大小通常为
4
,这就是为什么您得到了
4
。分配的字节位于
malloc(…)
的参数中,在您的例子中,这些字节是
sizeof(int)*6144
sizeof(int)*4800
。。。这不是一个2d数组,它是一组分段数组,带有一个指针数组来跟踪它们。有关如何正确动态分配二维阵列的信息。而且,你应该。