天天看点

eof在c语言中表示什么_C语言程序开发中,定义结构体时,为什么交换下成员顺序会报错?...C语言定义结构体成员,有顺序要求吗?讨论

在我之前的文章里,曾讨论过可以在C语言结构体里定义不指定长度的数组,以便后期根据需要扩展。小明看了这样的文章后,立刻就在自己的代码中使用了,但是他遇到了一个问题。

eof在c语言中表示什么_C语言程序开发中,定义结构体时,为什么交换下成员顺序会报错?...C语言定义结构体成员,有顺序要求吗?讨论

遇到了一个问题

C语言定义结构体成员,有顺序要求吗?

为了便于讨论,本文将相关C语言代码做了精简。小明首先编写了下面这样的代码:

struct s {int a;};struct z {int a;struct s b[];};int main(void) {return 0;}
           

一切正常,结构体 z 中的 b 成员可根据后期需求 扩展内存。不过,小明稍后写出了下面这样的C语言代码:

struct z { struct s b[]; int a; }; 
           

与上面的代码相比,仅仅是交换了结构体z的两个成员顺序而已。不过此时再编译,会发现编译器报错:"field has incomplete type 'struct s []'"这是怎么回事呢?难道C语言中的结构体在定义成员时,还有顺序要求吗?

eof在c语言中表示什么_C语言程序开发中,定义结构体时,为什么交换下成员顺序会报错?...C语言定义结构体成员,有顺序要求吗?讨论

有顺序要求吗?

讨论

首先应该明白,在C语言程序开发中定义结构体时,如果不考虑内存填充等其他因素,定义成员的顺序其实并不重要,例如

struct s{int a;int b;};
           

struct s{int b;int a;};
           

这两种定义方式并未带来本质上的差异,那为什么小明交换定义结构体成员的顺序,C语言编译器就报错了呢?

eof在c语言中表示什么_C语言程序开发中,定义结构体时,为什么交换下成员顺序会报错?...C语言定义结构体成员,有顺序要求吗?讨论

为什么C语言编译器报错呢?

读者应该注意"如果不考虑内存填充等其他因素"这句话,其实所谓的"其他因素"就是导致小明问题出现的原因。

struct z { struct s b[]; int a; }; 
           

请看这段C语言代码,如果像上面这样定义结构体 z,编译器显然无法确定成员 b 究竟会占用多少内存。这意味着如果后面还有其他成员,编译器就无法确定这些成员的偏移量。

在之前旧版本C语言中,struct s b[]; 是不允许作为结构体的成员,这样使得内存管理变得烦人。