对结构С++的误解
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 不需要知道更多。
如果这个问题看起来太“幼稚”,我提前道歉,但问题是:
这是一个简单的代码:
#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 不需要知道更多。