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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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语言 如何计算结构体的大小

无嵌套结构体的大小计算

如何计算结构体的大小?

由于存储变量地址对齐的问题,计算结构体大小的3条规则:
1、结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍。(对齐)
2、结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节的整数倍。(对齐)
3、结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍(补齐)

计算下面结构体的大小

struct Test1

	int b;
	double c;	
	long d;
Test1;
int main()

	printf("size = %d\\n", sizeof(Test1));
	return 0;


计算流程:当计算结构体大小时,为了方便计算,初始地址假设为0,int占了4个字节,总开辟的空间为4,因为要和下面的double类型对齐,double的起始地址必须为8,所以绿色部分为因对齐而另开辟的空间,double占了8个字节,所以现在总开辟的是16个字节,long的字 节为4, 16是4的倍数,所以long的起始地址为16,long占了4个字节,此时共开辟了20个字节大小的空间。因为最后面没有类型了,结构体变量的总大小要根据结构体变量中最大基本数据类型对齐,20要跟8对齐,但是20不是8的整数倍,所以在long的后面再开辟4个字节,所以最后一共开辟了24个字节。

程序运行结果

计算含有数组的结构体大小

计算含有数组的结构体大小时,需要注意的是,如果下一个成员是数组,则不需要偏移,只要连续开辟空间。
计算下面结构体的大小

typedef struct Test2

	char c[10];
	char ca[5];
	int a;

Test2;

int main()

	printf("size = %d\\n", sizeof(Test2));

	return 0;

计算流程:起始地址为0,char c[9]占了9个字节的空间,因为下一个成员也是数组,所以不用对齐,直接在地址9这里开辟一个数组char ca[5],占了5个字节,此时是占了14个字节,但是下一个成员是int类型,14不是4的整数倍,所以要从16地址开始存放int a,int占了4个字节,所以总开辟了20个字节,随后,结构体的总大小必须是结构体里最大基本类型的整数倍,这里为int 4个字节,20是4的整数倍,不用补齐,所以此结构体最总开辟了20个字节。

程序运行结果

计算嵌套结构体的大小

计算下面结构体的大小

typedef struct Test3

	short a;
	struct
	
		int b; 
		double c;
		long d;
	;
	int e; 
Test2;

int main()

	printf("size = %d\\n", sizeof(Test3));

	return 0;

计算流程:起始地址位置为0,short类型占了2个字节,下面的一个成员类型为结构体,此时要与嵌套的结构体里最大的基本类型,也就是和double 8字节对齐,所以另开辟空间6个,此时地址8是8的倍数,可以存放结构体,这里计算里面的结构体的大小为24,所以8+24=32,所以此时一共占了32个字节空间的大小,最后一个int类型,32是4的整数倍,所以int就直接存在结构体类型的后面,32+4=36,最后要和结构体最大的基本数据类型补齐,里面的结构体的类型也算。所以要与double 8补齐,36不是8的倍数,随后另开辟4个字节空间。所以最后结构体的总大小为40.

程序运行结果

如有疑问或者其它更好的方法,可以在下面评论区留言

以上是关于c语言结构体的问题,存储空间大小?的主要内容,如果未能解决你的问题,请参考以下文章

C语言 如何计算结构体的大小

C语言结构体占用空间内存大小解析

C语言-枚举共用体

C语言-枚举共用体

C语言中的结构体定义问题

C语言中结构体的理解