出于什么原因,结构中多了 3 个字节?可以去除吗?

For what reason there are 3 bytes more in structs? Can remove?

struct things {
    char foo[25];
    int bar;
};

struct morethings {
    char morefoo[25];
    int morebar;
    int another;
};

int main() {
    printf("char[25] + int: %d | struct things: %d\n\n", sizeof(char[25]) + sizeof(int), sizeof(struct things));
    printf("char[25] + int + int: %d | struct morethings: %d\n\n", sizeof(char[25]) + sizeof(int) + sizeof(int), sizeof(struct morethings));

    return 0;
}

Return:

char[25] + int: 29 | struct things: 32

char[25] + int + int: 33 | struct morethings: 36

我认为 sizeof 的 return 在这两种情况下应该相同,但结构总是有最多 3 个字节。发生这种情况的原因是什么?

可以删除吗?这可能会破坏我正在做的事情,即保存在文件结构中。

这取决于您使用的编译器,您需要类似

的东西
#pragma pack(push) 
struct things 
  {
    char foo[25];
    int bar;
  };
#pragma pack(pop). 

查看这些链接以获取更多信息

  1. GNU 编译器gcc
  2. 微软编译器MSDN

还有一个gcc具体的解决办法,就是

struct __attribute__ ((__packed__)) things 
  {
    char foo[25];
    int bar;
  };

另一种方法是将最大的元素或具有更严格对齐约束的元素放在结构中的最前面。尝试:

struct things
{
    int bar;
    char foo[25];
};

而不是

struct things
{
    char foo[25];
    int bar;
};