gpt4 book ai didi

c - 在 C 中将(指向整数数组的指针)分配给(指向转换为 void 指针的整数数组的指针)

转载 作者:太空宇宙 更新时间:2023-11-04 04:27:47 25 4
gpt4 key购买 nike

我遇到过类似于以下的 C 代码:

#include <stdio.h>
#include <stdlib.h>

int main(void) {

int *a = malloc(200*sizeof(int));

int i;

for (i = 0; i < 200; i++)
{
a[i] = i;
}

int (*b)[10] = (void*) a;

printf("\nsizeof(int):\t%d\n", sizeof(int));

printf("\nb[0]:\t%d\n", b[0]);
printf("\na:\t%d\n", a);

printf("\nb[19]:\t%d\n", b[19]);
printf("\na+190:\t%d\n", a+190);

printf("\nb[0][8]:\t%d\n", b[0][8]);
printf("\nb[19][9]:\t%d\n", b[19][9]);

return 0;
}

根据我的理解,行 int (*b)[10] = (void*) a; 试图分配指针 b (这应该是指向一个包含 10 个整数的数组)指向数组 a 类型转换为空指针的起始地址。我希望 b[i]a[i] 对于 i=0..9 保存相同的数据(以及任何索引b 的 0 到 9 会导致一些未定义的行为)。但是,该程序会生成类似于以下示例的输出:

sizeof(int):    4

b[0]: 9768976

a: 9768976

b[19]: 9769736

a+190: 9769736

b[0][8]: 8

b[19][9]: 199

很明显,b 变成了一个包含 20 个指针的数组,每个元素指针指向 a 数组的唯一部分,对应 10 个整数(或 40 个字节)每个。有人可以解释一下 int (*b)[10] = (void*) a; 到底是做什么的吗?具体来说,类型转换 (void *) 如何帮助将整个 a 分布到 b 的多个元素中?如果没有 (void *) 转换,上述代码将无法编译。

最佳答案

这样看:

int *a;
a = malloc(200 * sizeof(int));

int (*b)[10];
b = (void *)a;

所以,第一行说 a应该指向 int .第二行分配一 block 内存,可以容纳 200 int s,并将此 block 的起始地址分配给a .第三行说 b应指向 10 int 的数组秒。第四行说 b应分配由 a 持有的地址.

所以现在b指向一个数组 10 int s 从调用 malloc() 返回的地址开始.由于为 200 int 分配了内存小号,b指向一个内存块,可以容纳 20 个 10 元素数组 int .

投向void需要因为 a被声明为指向 int 的指针;这允许您存储 a 持有的值在 b , 尽管它们属于不同的类型。我认为这只是为了方便为数组分配适当的内存量。另一种方法,避免声明 a总而言之,将是:

int (*b)[10] = malloc(20 * sizeof(*b));

根据读者的口味,第二种方法可能看起来更神秘一些,也可能不那么神秘一些。我想第一种方法的一个优点是它允许您按顺序访问数组的元素并作为二维数组访问。

关于c - 在 C 中将(指向整数数组的指针)分配给(指向转换为 void 指针的整数数组的指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39842269/

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