关于sizeof(struct X)

文章详细解释了在32位操作系统中,如何通过计算结构体成员的偏移量和填充来确定`sizeof(structTest)`的值,强调了对齐规则对结果的影响。作者还给出了64位系统下嵌套结构体的示例。

在32位操作系统下,有下面的的结构体定义,则sizeof(struct Test)的值为(   )

struct Test{
		char a;    //1
		int b;     //8
		char c;    //12
		short d;   //12
		char e;    //16
		char f;    //16
};
  • A  10
  • B  12
  • C  16
  • D  14

答案:C

备注:题目“//”后是每一行把后面成员全注释掉时的大小。

解析:

        关于sizeof(struct X),其中主要包括两种对齐填充,从第一个成员开始依次计算:

                                ​​​​​​​        ​​​​​​​前一成员偏移量+(填充量)+当前成员大小

        当前一成员偏移量不是当前成员大小的非零整数倍时,先进行一次填充,再加上当前成员大小,求到最后一个成员后,总和还需要判断是否为每一个成员大小的公倍数,若不是,则再进行一次补齐填充,补到最接近的公倍数。

例如题中求到"int b"时,首先:

        char a的偏移量 =         0         +                  0            +                  1                         = 1,

                ​​​​​​​        ​​​​​​​        前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

        而sizeof(b)即sizeof(int) = 4,(前一成员偏移量)1 / sizeof(int) = 1 / 4 = 0,所以先进行填充,1+(填充量)3 = 4,

         int b  的偏移量 =         1         +                  3            +                  4                ​​​​​​​         = 8,

                ​​​​​​​        ​​​​​​​        前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

依此类推,直到最后一个成员:

        

         char c的偏移量 =         8         +                  0            +                  1                ​​​​​​​        = 9,

                ​​​​​​​        ​​​​​​​        前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

        

       short d的偏移量 =         9         +                  1            +                  2                ​​​​​​​         = 12,

                ​​​​​​​        ​​​​​​​        前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

        char e的偏移量 =         12         +                  0            +                  1                ​​​​​​​       = 13,

                ​​​​​​​        ​​​​​​​        前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

        char f的偏移量 =         13         +                  0            +                  1                ​​​​​​​         = 14,

                ​​​​​​​        ​​​​​​​        前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

        最后,判断14是不是char(1),short(2),int(4)的公倍数,显然不是,加上填充量2,最终sizeof(struct Test) = 16。

下面举例计算64位操作系统下带结构体嵌套的sizeof(struct X)

struct AA{
    int a;
    char b;
};
struct BB{
    char a;
    struct AA b;
    short c;
    long d;
};

计算sizeof(struct BB):

char a的偏移量 =         0         +                  0            +                  1                         = 1,

                ​​​​​​​        ​​​​​​​ 前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

struct AA b的偏移量 =  1         +                  3            +                  8                         = 12,

                ​​​​​​​        ​​​​​​​ 前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

short c的偏移量 =         12        +                  0            +                  2                         = 14,

                ​​​​​​​        ​​​​​​​  前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

long d的偏移量 =         14         +                  2            +                  8                         = 24,

                ​​​​​​​        ​​​​​​​        前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

最后,判断24是不是char(1),short(2),long(8)的公倍数,显然是,最终sizeof(struct Test) = 24。

小结:

记录学习sizeof(struct X),欢迎交流

在C语言和C#中,`sizeof`操作符在结构体上有不同的使用方式和原理。 ### C语言中`sizeof`对结构体的使用及原理 在C语言里,`sizeof`是一种单目操作符,以字节形式给出其操作数的存储大小,操作数可以是表达式或括在括号内的类型名,其返回值是`size_t`,在64位机器下被定义为`long unsigned int` [^1]。 当操作数为结构体时,`sizeof`会计算该结构体在内存中所占的字节数。计算时会考虑结构体成员的排列以及内存对齐的影响。例如,下面的代码展示了`sizeof`对结构体的使用: ```c #include <stdio.h> struct Example { int a; char b; double c; }; int main() { struct Example ex; size_t size = sizeof(struct Example); printf("结构体Example的大小是: %zu 字节\n", size); return 0; } ``` 在这个例子中,`sizeof(struct Example)`会计算`Example`结构体的大小。由于内存对齐的存在,该结构体的实际大小可能大于各个成员大小的简单相加。 ### C#中`sizeof`对结构体的使用及原理 在C#中,使用操作符`sizeof`可以检查结构体数据类型所占的内存。不过需要注意的是,必须在不安全的代码环境下才能使用`sizeof`来检查自定义结构体所占的内存 [^2]。 以下是一个示例代码: ```csharp using System; class Program { static void Main(string[] args) { unsafe { int x = sizeof(Student); Console.WriteLine(x); } } } struct Student { int ID; long Score; } ``` 在上述代码中,通过`sizeof(Student)`计算`Student`结构体所占的内存大小,并将结果存储在变量`x`中,最后将其输出。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值