永发信息网

C语言中结构体占用内存大小的问题

答案:4  悬赏:40  手机版
解决时间 2021-01-30 23:06
struct stOne // 结构体1
{
char c1;
int i1;
char c2;
int i2;
};

struct stTwo // 结构体2
{
char c1;
char c2;
int i1;
int i2;
};

各位大侠,上面两个结构体因为硬件的边界调整原则,占用内存大小并不相同。在我的电脑上,sizeof(struct stOne)是16,sizeof(struct stTwo)是12。

小弟有一疑问,会不会存在一种情况:
struct stOne stA, stB; // 定义两个结构体
这两个结构体大小并不相同,即同一类型结构体能否占用不同内存大小?
最佳答案
不会,同一个结构体占用的内存都是一样的,
stOne和stTwo之所以不同,是因为内存对齐问题。
取内存时,是按照主机系统是多少位来取的
32位系统,每次取四个字节
64位系统,每次取8个字节
根据你sizeof得到的结果,你的系统是32位的,所以每次取四个字节,而stOne char类型占用一个,而int占用四个,所以char类型自动占用了4个,否则,如果char占用一个,取得时候,去了一个char,然后去了int变量的前三个,这样会出问题,所以,会得到你上面sizeof的结果
stTwo,就不会因为是两个char类型挨着的,这样两个char类型占用四个,取得时候先取两个char,再取int。
全部回答
这是因为字节对齐原则,在Linux下其是按2字节对齐,可是在VC++下默认是按8字节对齐,必须满足4的整数倍。这样有助于存储效率。第一个char 为1字节,int为4字节,由于8字节对齐原则系统会预留出3个字节,保证8个字节对齐。而第二个两个char 2个字节,1个int4字节,系统补充2个字节后,此时8个字节,再加一个Int为12.满足条件

不会有问题的,把头文件包含进来就可以了,两个结构体互相引用时,如果不是指针才会出错,如果两个结构体有互相引用,就要先把一个typedef为空结构,这样编译才不会出错,编译过了就没问题了,有问题可以联系444376843,注明是“提问c”

你好,struct stOne stA, stB; // 定义两个结构体 这两个结构体大小完全相同!!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
肌肉痛吃止痛药有用么?
东风日产北京二手车交易中心地址在什么地方,
缙云怡居宾馆地址有知道的么?有点事想过去
讧侮的意思是什么啊?知道的请说下!
2012年7月24日,我国最南端的地级市——三沙
为什么绿茶喝多了就会觉得心慌难过,还会留很
全残后买保险,是拒保吗
风行汽车花乡直营店怎么去啊,我要去那办事
缙云中正宾馆地址有知道的么?有点事想过去
从浙江玉环到贵州德江有多运路途径那几个省及
初三600字作文,以走过初三为题目,三个小标
重庆谈判当中的美国人是谁?
下生的意思是什么啊?知道的请说下!
将一批购进的材料用于工程项目,材料成本为100
谁知道哈尔滨元申广电高清电视一年多少费用
推荐资讯
《欢乐颂》奇点是好人还是坏人
从南白到尚稽有只有27公里吗?
异质的意思是什么啊?知道的请说下!
田阳县水利局地址有知道的么?有点事想过去
五公镇博思体育舞蹈才艺中心地址好找么,我有
老惠红枣礼品地址在哪,我要去那里办事
南宁市国土资源局地址在什么地方,我要处理点
召唤师的淬炼之路
电子琴演奏崔京浩父亲用什么节奏和音色还有速
网上能查到手机短信什么时间发送的?多少条数
嫌间的意思是什么啊?知道的请说下!
冯子的意思是什么啊?知道的请说下!
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?