[英]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.