无法将 'float****' 转换为 'float (*)[128][3][4]' 进行初始化。

5
我有以下两个typedef:
typedef float matrix_3x4[3][4];
typedef matrix_3x4 bone_mat[128];

以下是函数定义:
float ****get_bones();

为什么下面的代码会给我一个类型转换错误?
bone_mat *mat = get_bones();

错误:

error: cannot convert ‘float ****’ tofloat (*)[128][3][4]’ in initialization
   85 |     bone_mat *mat = get_bones();
      |                     ~~~~~~~~~^~
      |                              |
      |                              float****

尝试将mat的类型更改为bone_matbone_mat**,但是float(*)[128][3][4]不应该与float****相同吗?
将函数的返回值强制转换为(bone_mat*)也不起作用。

3
不是答案,但是一旦你超过两层间接引用,考虑将类型更改为嵌套结构和数组。一个float ****很难进行推理。 - pmacfarlane
4
重要提示:数组不是指针。 - Mooing Duck
2
或许令人惊讶的是,float****不是一个4维数组。 - tstanisl
2
不是的。因为数组对象的维度是其类型的约束。float**** 本身没有包含维度信息,因此即使它可以使用 ptr[a][b][c][d] 的语法,它也不是指向数组的指针。 - tstanisl
2
@trxgnyp1 你有get_bones()的源代码吗?如果有的话,能贴出来吗? - Andrew Henle
显示剩余4条评论
1个回答

2
指针不是数组。指针可以指向数组的元素。`float ****`是一个指向`float`类型的指针,这在实际项目中很少见。
`mat`是一个指向`bone_mat`的指针,而`bone_mat`本身是一个包含128个数组的数组,每个数组又包含3个数组,每个数组包含4个浮点数。这是一种非常不同的类型。
如果你发布了`get_bones()`的源代码,我会感到惊讶如果它返回一个真正的`float ****`,我敢打赌它只是为`bone_mat`分配内存,并将对象指针转换为与分配大小和块使用不一致的类型。
引用Brian61354270的话:
想一想涉及到的内存和地址。`float*** *`是一个指向`float***`的指针。这意味着当你解引用一个`float****`时,你会到达一个包含`float***`的内存位置。不是一个`float`,而是另一个指针。解引用那个指针,你会到达一个包含`float**`的位置,仍然不是一个`float`,而是另一个指向指针的指针。我可以继续下去。与此相比,`float (*)[128][3][4]`是一个指向包含128 * 3 * 4个连续浮点数的内存块的指针。

1
我没有这个函数的源代码,只有定义。我将这个答案标记为有效,但是Brian61354270的评论解释得更好。 - trxgnyp1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接