动态内存分配和sizeof()

时间:2015-03-28 14:29:54

标签: c sizeof dynamic-memory-allocation

为了动态地将内存分配给二维数组,我写了类似这样的东西

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()的输出是微不足道的。请帮我接下两个。

1 个答案:

答案 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中无法从指针派生已分配了多少内存