为了动态地将内存分配给二维数组,我写了类似这样的东西
int **ar = (int **)malloc(row*sizeof(int*));
for(i = 0; i < row; i++)
ar[i] = (int*)malloc(col*sizeof(int));
我遇到了这个代码,但是我无法理解声明。
double (*buf)[2] = (double (*)[2])malloc(count*sizeof(double [2]));// Explain this
printf("%d, %d, %d, %d \n",sizeof(double));
printf(" %d",sizeof(buf[0]));
printf(" %d", sizeof(buf));
//prints 8, 16, 16, 4 when count is 3
第一个printf()
的输出是微不足道的。请帮我接下两个。
答案 0 :(得分:1)
double (*buf)[2] = (double (*)[2])malloc(count*sizeof(double [2]));// Explain this
这个
double (*buf)[2]
将buf
定义为指向2 double
s。
这个
(double (*)[2])malloc(count*sizeof(double [2]));
可以(并且应该)重写为
malloc(count * sizeof(double [2]));
以上行为2 count
s的数组分配大小为double
次'的内存。
此
=
将后者分配给前者。
所有这些都以[{1}}指向buf
count * 2
s的数组结束。
像这样访问其元素
double
请注意,此方法会创建一个指向“ linear ”数组的指针,该数组是一个数组,其中所有元素都存储在一个连续的内存块中。
虽然你在问题中提到的第一个问题是创建一个“分散的”数组,该数组是一个数组,其中每一行可能位于一个单独的内存块中。
这个
(*buf)[0][0];
引发未定义的行为,因为它的第一个(格式)参数printf("%d, %d, %d, %d \n",sizeof(double));
期望四个 addtional参数,并且只传递一个。
printf
的大小通常为8。
这个
double
打印printf(" %d",sizeof(buf[0]));
指向的第一个元素的大小。由于buf
指向2 buf
s的数组,因此预计会打印2次“double
的大小”,其中2 * 8 = 16。
此
double
打印printf(" %d", sizeof(buf));
的大小。当buf
被定义为指针时,将打印指针的大小。对于32位实现通常为4,对于64位实现通常为8。
注意:buf
的值不会出现在上面打印的任何大小中,而不是直接打印,也不会显示为indireclty,因为在C中无法从指针派生已分配了多少内存