C 结构中的大小

C 结构中的大小,c,struct,int,sizeof,C,Struct,Int,Sizeof,输出为356100450200。 为什么sizeofst是356而不是354? 我在没有int的情况下尝试了这个方法,结果是350 100 50 200,所以我假设问题出在整数中。这是由于结构成员之间的填充。填充是必要的,以确保每个数据成员都是正确的。精确的对齐要求取决于您的体系结构 因此,不能假设结构的大小等于其成员大小之和。这是由于结构成员之间的填充。填充是必要的,以确保每个数据成员都是正确的。精确的对齐要求取决于您的体系结构 因此,不能假定结构的大小等于其成员大小之和。结构中的每个非第一个

输出为356100450200。 为什么sizeofst是356而不是354?
我在没有int的情况下尝试了这个方法,结果是350 100 50 200,所以我假设问题出在整数中。

这是由于结构成员之间的填充。填充是必要的,以确保每个数据成员都是正确的。精确的对齐要求取决于您的体系结构


因此,不能假设结构的大小等于其成员大小之和。

这是由于结构成员之间的填充。填充是必要的,以确保每个数据成员都是正确的。精确的对齐要求取决于您的体系结构


因此,不能假定结构的大小等于其成员大小之和。

结构中的每个非第一个字段前面都可能有空格或填充。编译器正在添加间隙,以满足处理器和ABI约定的需要

您应该信任编译器,它正在按照实现的要求布置结构

一些编译器提供扩展来改变或改进结构的布局,例如,用于对齐或打包的GCC的布局

不要认为结构内部的填充和间隙是一个问题,而是一种资产:编译器会尽力满足处理器、ABI约定等要求

大多数编译器不会对结构中的字段进行重新排序。GCC过去有一个很少有用的优化,可以做到这一点,但该优化已被删除,因为有时它会造成损害,例如LTO

如果您关心结构大小,而不关心字段的顺序,则可以对它们进行巧妙的重新排序。但最密集的顺序可能取决于体系结构


顺便说一句,C标准甚至不能保证int是32位或比char更大的大小和对齐方式,即使这很常见。它为此目的提供和输入。我猜想,如果为int-s为16位的16位计算机进行编译,您可能不会看到任何填充或间隙。例如,20世纪80年代使用Intel 8086处理器的原始PC AT,或一些廉价的16位微控制器。

结构中的每个非第一个字段前面都可能有间隙或填充。编译器正在添加间隙,以满足处理器和ABI约定的需要

您应该信任编译器,它正在按照实现的要求布置结构

一些编译器提供扩展来改变或改进结构的布局,例如,用于对齐或打包的GCC的布局

不要认为结构内部的填充和间隙是一个问题,而是一种资产:编译器会尽力满足处理器、ABI约定等要求

大多数编译器不会对结构中的字段进行重新排序。GCC过去有一个很少有用的优化,可以做到这一点,但该优化已被删除,因为有时它会造成损害,例如LTO

如果您关心结构大小,而不关心字段的顺序,则可以对它们进行巧妙的重新排序。但最密集的顺序可能取决于体系结构


顺便说一句,C标准甚至不能保证int是32位或比char更大的大小和对齐方式,即使这很常见。它为此目的提供和输入。如果为16位机器(int-s为16位)进行编译,我怀疑您不会看到任何填充或间隙。例如,20世纪80年代使用Intel 8086处理器的原始PC AT,或一些廉价的16位微控制器。

您没有告诉我是哪种编译器、处理器、操作系统。。。您正在使用%d打印尺寸吗?不要使用%d打印尺寸。改用%zu。@basilestrynkevitch:没关系。所有平台的答案都是一样的。@BasileStarynkevitch:问题是为什么会发生这种情况,而不是我的计算机上的字段是如何对齐的。为什么在所有平台上的答案都是相同的,您不需要知道int的宽度来回答这个问题。顺便说一句,malloc现在已经存在,并且标头已被弃用,或者对于其他您不使用的非标准函数很有用。您没有说明哪个编译器、处理器、操作系统。。。您正在使用%d打印尺寸吗?不要使用%d打印尺寸。改用%zu。@basilestrynkevitch:没关系。所有平台的答案都是一样的。@BasileStarynkevitch:问题是为什么会发生这种情况,而不是我的计算机上的字段是如何对齐的。为什么在所有平台上的答案都是一样的,你不需要知道int的宽度来回答这个问题。顺便说一句,malloc现在已经存在,并且header已经被弃用,或者对于你不使用的其他非标准函数很有用。在你的特殊情况下,int在一个四字节的边界上对齐,在它之前需要两个字节的填充-Nope;100 % 4 == 0. 正确的答案是该结构与4字节的倍数354%4==2对齐。@JimBalter:你说得很对,谢谢。作为旁注,这也意味着结构中成员声明的顺序可能会影响其大小。@Gabrieleptronella Like sizeofstruct{int a;char b;char
c、 }==但在OP的平台上,sizeofstruct{char a;int b;char c;}==12。这基本上就像玩乐高玩具一样,在你的特殊情况下,int是在一个四字节的边界上对齐的,在它之前需要两个字节的填充-Nope;100 % 4 == 0. 正确答案是该结构与4字节的倍数354%4==2对齐。@JimBalter:你说得很对,谢谢。作为旁注,这也意味着结构中成员声明的顺序可能会影响其大小。@Gabrieleptronella类似于sizeofstruct{int a;char b;char c;}==8,但sizeofstruct{char a;int b;char c;}==12在OP平台上。精确地说。这基本上就像玩乐高一样。一个结构中的每个非第一个字段前面都可能有一个间隙或填充物。-在这种情况下,所有字段前面都没有空格;间隙位于最后一个字段之后,以将结构大小填充为4的倍数。结构中每个非第一个字段的前面可以有间隙或填充。-在这种情况下,所有字段前面都没有空格;间隙位于最后一个字段之后,用于将结构大小填充为4的倍数。
 #include <stdio.h>
 #include <string.h>
 #include <malloc.h>

struct Student {
       char name[100];
       int id;
       char major[50];
       char address[200];
};

int main()
{

     struct Student st;

     strcpy(st.name, "Chuck");
     st.id = 20001;
     strcpy(st.major, "Computer Science");
     strcpy(st.address, "1st Street");

     printf("%d %d %d %d %d\n", sizeof(st), sizeof(st.name),sizeof(st.id), sizeof(st.major), sizeof(st.address));

     return 0;
}