C结构成员顺序

时间:2014-06-27 05:10:14

标签: c struct

我正在接受一段代码...在linux中编程。我对结构进行了一些小改动

typedef struct {
  unsigned int a1;
  ..
  ..
  ..
  float f1;
  unsigned int a2;
  unsigned int a3;

  unsigned int offending; // shifted this
} test;

我将unsigned int offending转移到float f1之前,如下所示:

typedef struct {
  unsigned int a1;
  ..
  ..
  ..
  unsigned int offending;
  float f1;
  unsigned int a2;
  unsigned int a3;


} test;

并且代码崩溃了......可能是什么问题?

c结构的成员顺序是否重要?

2 个答案:

答案 0 :(得分:3)

可能是什么问题?取决于其余的代码,以及你做了什么。

不,结构成员的顺序本质上不重要。当其他代码依赖它时就会这样做。

可能的原因(并非详尽无遗):

  • 您没有重新编译所有内容,并且此结构或其某些方面存在外部链接。
  • 通过移动该成员,您更改了其他成员和/或sizeof()结构的对齐方式,并没有对此进行补偿。
  • 有一个文字常量或宏,其大小或偏移量取决于此结构。
  • 由于内存布局发生变化,以前从未失败的错误代码现在已经失败了。
  • 结构在某处作为另一个结构或联合的一部分使用,问题与此有关。
  • 使用{}进行列表初始化,不再与成员订单匹配。

你真的应该提供它崩溃的细节。否则就是猜测。也许即便如此。

编辑:ht @Jens。

答案 1 :(得分:1)

如果更改数据布局,最可能的崩溃原因是初始化。如果您的代码中有使用声明顺序的旧时初始值设定项,那么字段突然会收到与以前不同的值。因此,C99之后的现代C具有指定的初始化器,可以避免这个问题:

test toto = { 32, ... , 42, };                    // sensible to reordering
test tata = { .a1 = 32, ... , .offending = 42, }; // still the same