-1

我已经动态分配了二维数组。这是代码

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 回答 4

2

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

于 2012-09-28T06:39:47.033 回答
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;
于 2012-09-28T07:21:54.567 回答
1

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

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

于 2012-09-28T07:13:11.133 回答
0

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

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

于 2016-07-02T03:14:08.363 回答