我有以下两个类型定义:

typedef float matrix_3x4[3][4];
typedef matrix_3x4 bone_mat[128];

和以下函数定义:

float ****get_bones();

为什么下面的代码给我一个类型转换错误?

bone_mat *mat = get_bones();

错误:

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

try 将mat的类型更改为bone_matbone_mat**,但float(*)[128][3][4]不应该与float****相同吗?

将函数的返回值转换为(bone_mat*)也不起作用.

推荐答案

指针是not个array.指针可以指向数组的元素.float ****是指向float的指针,而float在现实生活中不太可能遇到.

mat是指向bone_mat的指针,bone_mat本身是一个数组或128个数组,其中3个数组包含4个浮点数,这是一种非常不同的类型.

如果您将源代码发布到get_bones(),如果它返回实际的float ****,我会感到惊讶,我打赌它为bone_mat分配了内存,并将对象指针转换为与分配大小和块使用不一致的类型.

-报价Brian61354270:

考虑一下所涉及的内存和地址.float*** *是指向float***的指针.这意味着当您取消对float****的引用时,您会到达内存中包含float***的位置.不是float,而是指向另一个指针的指针.取消引用该指针,您将到达一个包含float**的位置,仍然不是float,而是指向指针的另一个指针.我可以继续走下go .与此形成对比的是,float (*)[128][3][4]是指向具有12834个连续浮点数的内存块的指针.

C++相关问答推荐

如何用C(使用两个s补数算术的32位程序)计算

为什么I2C会发送错误的数据?

GLIBC:如何告诉可执行文件链接到特定版本的GLIBC

向上强制转换C中的数值类型总是可逆的吗?

使用AVX2的英特尔2022编译器的NaN问题&;/fp:FAST

_泛型控制表达式涉及数组碰撞警告的L值转换错误?

加密解密工作正常,但返回错误0x80090005

C指针概念分段故障

ifdef __cplusplus中的整数文字单引号

C I/O:在Windows控制台上处理键盘输入

编译器如何处理具有更复杂值的枚举?

Fprintf正在写入多个 struct 成员,并且数据过剩

从C中的函数返回静态字符串是不是一种糟糕的做法?

隐藏测试用例无法在c程序中计算位数.

向左移位3如何得到以字节为单位的位数?

在Ubuntu上使用库部署C程序的最佳实践

解密Chrome加密密钥

WSASocket在哪里定义?

使用复合文字数组初始化的指针数组

C11 嵌套泛型