C结构的成员顺序



我正在接管一段代码…在linux中编程。我对struct

做了一个小改动
typedef struct {
  unsigned int a1;
  ..
  ..
  ..
  float f1;
  unsigned int a2;
  unsigned int a3;
  unsigned int offending; // shifted this
} test;

我把unsigned int移到了float f1之前,像这样:

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

} test;

和代码崩溃…有什么问题吗?

c结构体的成员顺序重要吗?

有什么问题吗?这取决于剩下的代码,以及你还做了什么。

不,结构体成员的顺序在本质上并不重要。当其他代码依赖于它时,它是这样的。

可能原因(不完全):

  • 你没有重新编译所有的东西,并且在这个结构体或它的某些方面存在外部链接。
  • 通过移动成员,您改变了其他成员的对齐方式和/或sizeof()结构体,并且没有对此进行补偿。
  • 在某个地方有一个文字常量或宏,其大小或偏移量取决于该结构体。
  • 有错误的代码,从来没有失败过,但现在却因为内存布局的变化。
  • 结构体在某个地方被用作另一个结构体或联合的一部分,并且问题与此相关。
  • 使用{}的列表初始化不再匹配成员顺序。

你真的应该提供它是如何崩溃的细节。否则就是猜测。甚至到那时。

编辑:ht @Jens.

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

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

最新更新