gpt4 book ai didi

C 数组声明语法

转载 作者:太空宇宙 更新时间:2023-11-04 00:57:38 24 4
gpt4 key购买 nike

在您的包含文件中声明一个数组,省略第一个维度大小:

extern float mvp[][4];

然后在翻译单元中的先前声明之后定义数组:

float mvp[4][4];

没问题。直到您尝试在包含第一个声明的文件中获取该数组的大小。然后你会得到:

error: invalid application of 'sizeof' to an incomplete type 'float [][4]'

我知道数组在用作左值时会退化为指向其第一个元素的指针,函数原型(prototype)中的数组声明实际上是伪装的指针,但这里不是这种情况。但是第一个声明没有声明一个指针,它声明了一个“不完整的数组类型”,不同于:

extern float (*mvp)[4];

声明变量时,编译器仅引用“虚拟”基地址偏移量和链接器将解析的关联类型。

我想知道为什么允许这种“不完整的数组类型”存在——它不能像指向数组的指针那样递增,但也不是完整的数组,因为它的大小无法检索到?

为什么不将其隐式转换为指针(只是一个基地址偏移量)或什至更好,为什么不在第一维中遗漏大小时抛出错误?


引用 this

If expression in an array declarator is omitted, it declares an array of unknown size. Except in function parameter lists (where such arrays are transformed to pointers) and when an initializer is available, such type is an incomplete type (note that VLA of unspecified size, declared with * as the size, is a complete type)

实际上,该类型是不完整的,等待稍后通过稍后的声明或暂定定义来完成。

最佳答案

使用 extern 并不能使事物存在,它只是用来说明某些事物可能存在于不同的翻译单元中。 sizeof() 只能用于完整类型。这与数组指针衰减无关。 extern float (*mvp)[4] 是一个完整的类型,它是一个指向 4 个 float 数组的指针。 extern float mvp[][4] 不完整它是一个二维 float 组,其中一个维度未指定。这是两件截然不同的事情。在任何一种情况下,当使用正确的语法时,mvp 都可以用作数组,但您只能使用 sizeof,如果它实际上可以确定其大小。

另外float mvp[][4]也是一个数组,只是它的大小是不确定的。使它成为一个数组的原因是它的内存布局像一个数组。

关于C 数组声明语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53916786/

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