繁体   English   中英

动态内存分配和sizeof()

[英]Dynamic memory allocation and sizeof()

为了动态地将内存分配给二维数组,我编写了这样的内容

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()的输出很简单。 接下来的两个请帮我。

double (*buf)[2] = (double (*)[2])malloc(count*sizeof(double [2]));// Explain this 

这个

double (*buf)[2]

定义buf为指向2 double数组的指针。

这个

(double (*)[2])malloc(count*sizeof(double [2]));

可以(并且应该)重写为

malloc(count * sizeof(double [2]));

上一行以count次数“ 2 double s数组的大小”的大小分配内存。

这个

=

将后者分配给前者。

所有这些都以buf指向count * 2 double s数组组成。

这样访问其元素

(*buf)[0][0];

请注意,此方法会创建一个指向“ 线性 ”数组的指针,该数组是将所有元素存储在一个连续内存块中的数组。

而您在问题中第一次提到的方法会创建一个“ 分散的 ”数组,该数组是每行可能位于单独的内存块中的数组。


这个

printf("%d, %d, %d, %d \n",sizeof(double));

引发未定义的行为,因为printf从其第一个(格式)参数开始,期望有四个附加参数,并且仅传递了一个

double大小通常为8。

这个

printf(" %d",sizeof(buf[0]));

打印buf指向的第一个元素的大小。 由于buf指向2个double的数组,因此预期将打印2倍“ double大小”,即2 * 8 = 16。

这个

printf(" %d", sizeof(buf));

打印buf的大小。 由于将buf定义为指针,因此将打印on指针的大小。 对于32位实现,通常为4;对于64位实现,通常为8。

注意: count的值不会出现在上面打印的任何大小中,既不会直接出现,也不会出现顽强性,因为在C语言中,无法从指针得出已分配多少内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM