浅尝辄止39-不完整类型的使用

今天看代码,发现一个结构体,但是找不到定义,但是程序还是可以正常编译,这是为什么呢?

编译错误

尝试编译如下代码

#include <stdio.h>

struct ss;
int main()
{
    int i = sizeof(struct ss);
    printf("%d\n", i);

    return 0;
}

结果可想而知,会有编译错误,说struct ssincomplete的,即不完整的。
这很容易理解,因为struct ss只有声明,没有定义。

main.c:6:10: error: invalid application of 'sizeof' to an incomplete type 'struct ss'

编译没错误

尝试编译如下代码

#include <stdio.h>

struct ss;
int main()
{
    int i = 1234;
    struct ss *s = (struct ss *)&i;
    printf("%d\n", *(int *)s);

    return 0;
}

输出

没错,不仅可以编过,而且运行正常。

1234

类型为什么需要complete?

要想知道为什么是以上现象,得搞明白类型对于程序有什么意义。
程序的类型最关键的就是size,编译器要求类型定义完整,就是要知道如何把这个类型的数据放到内存中。编译器必须知道,应该分配多大空间放它?先放什么后放什么?
这就可以解释为什么第一段程序会编译错误,因为类型没有定义,编译器没法知道它有多大。
第二段程序为什么没有错误,原因也很明显了,因为编译器不需要知道它的大小。请注意struct ss *s只是个指针,所以编译器只需要知道struct ss的指针大小,而不需要知道struct ss的大小,所以编译器没有困惑,程序也可以运行。

这下真相大白了,我看的代码也只是用了不完整类型的指针,既没有用sizeof,也没有访问其成员,估计那个结构体的意义也就是名字有意义了,新技巧get!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容