C sizeof(结构)不在填充之后

C sizeof(结构)不在填充之后,c,struct,structure,sizeof,C,Struct,Structure,Sizeof,考虑一下 #include<stdio.h> struct outside1 { int a; char b; char c; char d[3]; }; struct outside2 { char a,b,A[2]; char B[2]; }; int main() { printf("%zu %zu\n",sizeof(struct outside1),sizeof(struct outside2)); re

考虑一下

#include<stdio.h>

struct outside1
{
    int a;
    char b;
    char c;
    char d[3];
};

struct outside2
{
    char a,b,A[2];
    char B[2];
};

int main()
{
    printf("%zu %zu\n",sizeof(struct outside1),sizeof(struct outside2));
    return 0;
}
#包括
外部结构1
{
INTA;
字符b;
字符c;
chard[3];
};
外部结构2
{
字符a,b,a[2];
charb[2];
};
int main()
{
printf(“%zu%zu\n”、sizeof(struct outside1)、sizeof(struct outside2));
返回0;
}
通过使用填充概念预测输出,它将是“12 8”。但实际产出是“12 6”

使用gcc 4.7.2 Debian

有人能解释一下吗


-新手

char
int
几乎在任何实现中都有自己大小的对齐要求

sizeof(char)
每个标准为1,而
int
的常用尺寸为1、2和4

这导致了6、8、12的
外部1
的常见尺寸。
对于6的外部2

顺便说一句:编译器允许在每个结构成员之后插入任意数量的填充,尽管它通常使用最小的必要条件来考虑对齐限制,以便轻松遵循“公共初始子序列”规则


此外,由于C99或其附近的对齐限制为2的幂,因此对象大小必须能被它平均整除。

char
int
在几乎任何实现中都有其自身大小的对齐要求

struct outside2
{
    char a,b,A[2];
    char B[2];
};
sizeof(char)
每个标准为1,而
int
的常用尺寸为1、2和4

这导致了6、8、12的
外部1
的常见尺寸。
对于6的外部2

顺便说一句:编译器允许在每个结构成员之后插入任意数量的填充,尽管它通常使用最小的必要条件来考虑对齐限制,以便轻松遵循“公共初始子序列”规则

此外,由于C99或其附近的对齐限制为2的幂次,因此对象大小必须能被它平均整除

struct outside2
{
    char a,b,A[2];
    char B[2];
};
您希望此结构的大小为8字节;实际上,它的大小是6字节(在您的实现中)

不需要任何额外的填充。任何类型的数组都具有与元素类型相同的对齐要求,这意味着
A
B
只需要字节对齐

结构中总共有6个
char
成员或子成员。由于不需要填充,因此总大小为6字节

例如,编译器可以在末尾添加另外2个字节的填充。例如,如果它要求所有结构或大于某个大小的所有结构至少具有4字节对齐,则可能会这样做。但是您正在使用的编译器并不是这样做的

当然,不同系统的具体对齐和填充要求可能不同;它们由每个编译器强制执行,可能由平台的定义

您希望此结构的大小为8字节;实际上,它的大小是6字节(在您的实现中)

不需要任何额外的填充。任何类型的数组都具有与元素类型相同的对齐要求,这意味着
A
B
只需要字节对齐

结构中总共有6个
char
成员或子成员。由于不需要填充,因此总大小为6字节

例如,编译器可以在末尾添加另外2个字节的填充。例如,如果它要求所有结构或大于某个大小的所有结构至少具有4字节对齐,则可能会这样做。但是您正在使用的编译器并不是这样做的


当然,不同系统的具体对齐和填充要求可能不同;它们由每个编译器强制执行,可能由平台的定义。

似乎是这样
char
为1字节。尝试将
int
置于
a
b
之间的
outside 2
。编译器应该添加3个字节(如果
int
在您的平台上是4个字节),如果您能够解释(通过更新您的问题)为什么希望
sizeof,这将是很有帮助的(struct Outside 2
应该是8而不是6。它似乎是这样的。
char
是1个字节。尝试在
a
b
之间放置一个
int
,在
Outside 2
中。编译器应该添加3个字节(如果
int
在您的平台上是4个字节),如果您能解释一下(通过更新您的问题)会有所帮助)为什么你期望sizeof(struct Outside 2)是8而不是6。有没有平台对结构有这样的要求,与它们的实际成员无关?也许是旧的PDP-#?@重复数据消除器:我不知道。在SPARC上,它比x86有更严格的对齐要求,
sizeof(struct Outside 2)==6
。是否有任何平台对结构有这样的要求,独立于其实际成员?也许是旧的PDP-#?@重复数据消除器:我不知道。在SPARC上,它比x86有更严格的对齐要求,
sizeof(struct outside2)==6
。谢谢@Deduplicator。这太技术化了,你能用更简单的方式回答吗?谢谢@Deduplicator。这太技术化了,你能用更简单的方式回答吗?