接下来,我们就来学习一下,内容比较简单,一看就懂,一学就会。
不完整类型(Incomplete types)是缺少足够信息来确定该类型对象大小的对象类型,不完整类型可以在翻译单元的某些点完整。
听起来可能比较绕口,简单来说就是,不完整类型是不知道对象所占空间大小,此时是无法使用sizeof()的。但是可以通过后续再补充完整。
不完整类型主要有下面三种。
内容未知的结构体或联合体类型。在同一作用域的后面,定义同一结构体或联合体的内容的声明能使之完整。
struct node {简单来说就是大小未知的数组,之后指定大小的声明能使之完整,接下来看一个示例。
#include<stdio.h>如果在fun1函数中打印数组a的长度编译时就会报如下错误:
复制代码
- invalid application of 'sizeof' to incomplete type 'int[]'
因为此时a为不完整类型,即不知道a的长度,所以无法使用sizeof。
但有的小伙伴却有疑问了,为什么在fun1函数中却可以设置a[0]的值?
虽然这里使用了数组a,但是它会被转换成指向其首元素的指针,而且这个转换并不需要知道数组的大小。
而且C语言也不会检查数组是否越界,他选择相信程序员,把重心放在了程序的执行效率上,这也是为什么C语言执行效率高运行快的原因。
感兴趣的可以参考:为什么C语言执行效率高,运行快?
其实在外部声明的时候可以完整声明,例如上述示例我可以改为:extern int a[3];
此时在编译程序fun1就不会有编译报错提示了。
因为数组元素不能具有未知边界数组类型,所以多维数组只能在第一个维度中有未知边界:
可由 CV 限定,有别于其他不完整类型, void 不能补充声明为完整类型。
不完整类型有三种:
欢迎光临 谷动谷力 (http://bbs.sunsili.com/) | Powered by Discuz! X3.2 |