【问题标题】:Misunderstanding of the structure С++ [closed]对结构С++的误解[关闭]
【发布时间】:2022-01-25 11:48:06
【问题描述】:

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

这是一个简单的代码:

#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 结构仍未定义。 为什么指向不存在的结构的指针会起作用?

【问题讨论】:

  • C 标准在结构命名空间中定义一个 incomplete 结构,编译器一看到关键字struct。所以定义了不完整的结构,但是你不能使用它,因为它是不完整的。另一方面,指向结构的指针总是被定义。
  • 请不要标记垃圾邮件。 C 和 C++ 是两种不同的语言。

标签: c++ pointers sizeof incomplete-type


【解决方案1】:

此声明

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 页)

指针类型是一个完整的对象类型。

【讨论】:

  • “指针总是完整的类型。” 真的吗?有些指针的大小可能与其他指针不同。
  • @klutt 来自 C 标准“指针类型是完整的对象类型。”
  • @klutt - 尽管指针 可以 有不同的大小,但指向结构的指针却不能(这是因为这段代码是有效的 :-)。
  • @BoP 是的,我知道。我只是想知道是否可以声明一个指针,不清楚它是指向结构还是函数的指针
【解决方案2】:
struct my_struct
{
    struct fictitious_name fn_struct;
};

这里将内部结构的内容放在外部结构中。如果不知道定义,则不知道大小,无法保留空间。


struct my_struct
{
    struct fictitious_name* fn_struct;
};

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

【讨论】:

    猜你喜欢
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多