gpt4 book ai didi

c - 动态内存分配和 sizeof()

转载 作者:行者123 更新时间:2023-11-30 15:22:09 25 4
gpt4 key购买 nike

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

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 数组的大小”。

这个

=

将后者分配给前者。

最后,buf 指向一个 count * 2 double 数组。

像这样访问它的元素

(*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 被定义为指针,因此会打印指针的大小。对于 32 位实现,该值通常为 4;对于 64 位实现,该值通常为 8。

注意:count 的值不会出现在上面打印的任何大小中,既不是直接出现,也不是间接出现,因为在 C 中,不可能从指针推导出有多少内存。分配给它。

关于c - 动态内存分配和 sizeof(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29318295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com