我已动态分配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。
答案 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>