1.结构体对齐数

结构体占用图从0开始画,然后每一个变量占用内存需要和对齐数对齐,和几对齐选min(系统对齐数,变量大小)
2.

注意点:现在32位机器上(X86),C语言的long和int都是4字节,代表长整型和整型,老机器上才是4、2字节的区分。C语言只规定了sizeof的long》=int一般认为都是4。
vs的32和64下,long都是4
且第二题一看就选A,第二个位置,整体结构体大小,要整除编译器对齐数。
pragma pack(4):编译选项,4字节对齐。
3.位段
回忆:位段的位是bit位。位段开辟空间,按照类型开辟,遇上结构体中变量是int,开4个字节。
这道题,都是无符号char类型,一开开1个字节,8位。
开辟顺序位:1,(Env、Paral)、1、1,共需要3个字节。

坑:
这个题坑在替换define 的A+B,在代码sizeof后面,只做替换,所以最后是sizeof(Recode)2+3
结果是:32+3 = 9
4.
回忆:memset():C语言中对数组或结构体初始化置0的最快方法,因为直接在内存上做操作。
memset(a, 0, sizeof(a));直接从0到大小a处置为0
- 分析:
- tag是位段:ucP1字节,下面共1,共2。
- puc转为了位段类型,忘记了强转代表能使用的空间大小

- 一开始,申请puc[4],会申请4字节。
当下面做强转成tagPIM给了pst后,可以动它的前两个字节,相当于把pst结构体指针指向了这片地址的头。
但是由于结构体原因,只能动它的前面两个字节。后面两个是0
给2:0000 0010
给3:0000 0011
给4:0000 0100
给5:0000 0101
然后2给第一个pim1,是一个字节,则拿到:0000 0010
给3,给bit1,只能能到末位1,且在图右侧中,是第二个字节中的最后,因为先使用低地址,再用高,所以从右向左。
给4,拿bit2,00
给5,拿比特3,101,
最后:0000 0010 ,0010 1001-> 2,41
输出为16进制,2代表至少拿两位:02, 29,0,0
5.

首先,联合体大小为较大的值,short数组,最终是14,int是4,所以选14,
但要注意对齐数。
short的对齐数是2,int是4,最后大小要对齐,所以应16。
6.
这种匿名定义法,得到的联合体或结构体,都是只用一次。

分析:
- 开辟空间:对齐数2,1,按最大:2字节。也符合了对齐
- 给i[0] 0x39 、i[1] 0x38,i[0]在数组中,肯定是低地址,而i[1]是高地址。
- 当以short的k拿出时,short是短整型,就算16进制,也是按左高地址右地址呈现。
所以: 3839 。
一般,小端模式(低位数据放低地址,高位数据放高地址),就是高地址在左边,低地址在右边。就算符合我们正常看数字的习惯。
7.

枚举默认值从头开始是0开始加1,到了Z1后,A1、B1会依次加1
8
这个题VS2013,没有什么特别意思,跟19、22差不多:

本文深入探讨了C语言中的结构体对齐原则,解释了如何计算结构体大小并设置对齐数。同时,介绍了位段的概念,讨论了在不同场景下位段的使用和内存分配。此外,还分析了memset函数在结构体初始化中的作用,并通过实例展示了其工作原理。最后,涉及了联合体的大小计算及其对齐规则。文章适合C语言初学者和进阶者阅读,以增进对C语言内存管理的理解。
2860

被折叠的 条评论
为什么被折叠?



