C语言结构体大小问题求助。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言结构体大小问题求助。相关的知识,希望对你有一定的参考价值。

#include "stdio.h"
typedef struct date S_date;
struct date

int month;
int day;
int year;
birthday;
struct student

int num;
char name[20];
S_date birthday;

stu;
void main()

printf("%d",sizeof(stu));


打印出来的是 36
莫非就是 4 + 20 + 12
这里不要考虑内存对齐的问题么?
求大神解惑。
我误以为要按S_date birthday(12字节)对齐了,其实S_date birthday也是按int(4字节)对齐的。
我把int num改为double num试了一下,就是按8字节对齐了。谢谢各位。

参考技术A 对,编译器会考虑对齐的,你可以把 month改为char型
struct date

char month;
int day;
int year;
birthday;

结果应该还是36的,char要占4个字节
参考技术B 对齐了就是36啊,按4字节对齐 参考技术C 如果char是1个字节,int是4个字节,默认情况下char好像可以随便放,int的首字节的地址必须对齐到4的倍数。假如有个char正好摆在一个4的倍数地址上,后面若紧跟着一个int,这个int只能对齐到下一个4的倍数地址上,所以会看起来填充了3个地址单元,如果int前面连续两个char紧挨着,编译器照样会在int的前面补足2个单元。
你的这个数据结构正好让char填充了4的倍数字节,所有的数据成员刚好紧凑排列,可以改一下你那个name的长度,比如19或者21,也可以调换一下 顺序,就能看出是怎么对齐的了。本回答被提问者采纳
参考技术D 内存对齐一般按4字节
4,20,12本身就对齐了
第5个回答  2012-08-11 我用的是TC 结果是28 也就是2*4+20

c语言结构体的问题,存储空间大小?

win32
4字节对齐
变量内存的起始地址的边界是跟它类型一致的
比如int类型,可以认为它存在4的倍数的地址,short存在2字节倍数开始的地址,char存在1字节开始的地址,即任意地址
因此,回过头来看
第一个结构
假设int
a;///4字节倍数地
short
b;//推理a的末尾是4字节倍数地址也是2字节倍数地址,所以b是挨着a存的
char
c;//任意其实地址,挨着b存放
看起来7个字节就放下了,但是需要兼顾4字节对齐的原则,在末尾补了一个字节
第二个结构也类似
结构体与普通类型并无大区别,存储区域也一样的
参考技术A 一样的啊
结构体的存储空间就是里面每个元素存储空间的总和
这2个结构体都是1个int,1个short和1个char,这2个结构体的存储空间都=(int的存储空间+short的存储空间+char的存储空间),所以是一样的
参考技术B 编译器为优化一般会将结构体4字节对齐,题中的结构体大小相同。
若int在中间,那么会更高。
关于结构体存储:
定义存在只读数据区
变量根据需要分别存在于数据区、堆栈区等。
地址,一般按4字节对齐
参考技术C 结构体长度求法:
a.成员都相同时(或含数组且数组数据类型同结构体其他成员数据类型):
结构体长度=成员数据类型长度×成员个数(各成员长度之和);
结构体中数组长度=数组数据类型长度×数组元素个数;
b
成员不同且不含其它结构体时;
(1).分析各个成员长度;
(2).找出最大长度的成员长度M(结构体的长度一定是该成员的整数倍);
(3).并按最大成员长度出现的位置将结构体分为若干部分;
(4).各个部分长度一次相加,求出大于该和的最小M的整数倍即为该部分长度
(5).将各个部分长度相加之和即为结构体长度
c含有其他结构体时:
(1).分析各个成员长度;
(2).对是结构体的成员,其长度按b来分析,且不会随着位置的变化而变化;
(3).分析各个成员的长度(成员为结构体的分析其成员长度),求出最大值;
(4).若长度最大成员在为结构体的成员中,则按结构体成员为分界点分界;
其他成员中有最大长度的成员,则该成员为分界点;
求出各段长度,求出大于该和的最小M的整数倍即为该部分长度
(5).将各个部分长度相加之和即为结构体长度

以上是关于C语言结构体大小问题求助。的主要内容,如果未能解决你的问题,请参考以下文章

c语言结构体变量怎么比较大小假设p,e都是如下类型的结构体变量?

c语言如何实现结构体的深度复制

c语言中使用结构体位段的结构体大小

c++/c语言求助 string变量作为结构体成员在引用的时候内存不可读的问题

c语言中如何将按结构体中的某个元素大小,将结构体排序输出

C语言求助。急急