对结构С++的误解

Misunderstanding of the structure С++

如果这个问题看起来太“幼稚”,我提前道歉,但问题是:

这是一个简单的代码:

#include <iostream>

struct my_struct
{
    struct fictitious_name fn_struct;
};



int main()
{
  
}

未编译,因为fictitious_name结构未定义

但是如果我这样重写它:

#include <iostream>

struct my_struct
{
    struct fictitious_name* fn_struct;
};



int main()
{
  
}

然后一切正常,代码编译通过,但是fictitious_name结构体还是未定义。 为什么指向不存在的结构的指针有效?

这个声明

struct fictitious_name fn_struct;

引入不完整类型struct fictitious_name。也就是说,这种类型的对象的大小是未知的。因此,编译器不知道为对象 fn_struct.

保留多少内存

在此声明中

struct fictitious_name* fn_struct;

还引入了不完全类型struct fictitious_name。但是具有指针类型的对象 fn_struct 的大小是已知的。它是指针的大小。所以对象fn_struct是一个完整的类型

指针总是完整类型。

来自 C 标准(6.2.5 类型,第 #20 页)

A pointer type is a complete object type.

struct my_struct
{
    struct fictitious_name fn_struct;
};

这里把内层结构的内容放到了外层结构中。如果定义未知,则大小未知,无法保留 space。


struct my_struct
{
    struct fictitious_name* fn_struct;
};

此处指向内部结构的指针被放入外部结构。指向结构的指针具有已知大小,因此没问题。如果您尝试访问内部结构的成员或在其上使用 sizeof(例如 malloc 需要),那么您需要定义。在那之前,它只是一个指针,C 不需要知道更多。