关于C语言中结构体在内存中存储的认识

        今天也是刚学习完,C语言的结构体。也是有了不少的收获。

         首结构体主要的陌生的内容,就是在内存中的储存方式,首先需要认识一个数:对齐数,对齐数是用来判断结构体成员在距离偏移量为0位置的相对位置的数字,而结构体第一个成员就位于结构体偏移量为0位置的位置。举个例子,我们定义以下结构体

struct Stu{
    int age;
    char name;
    int id
};


struct Stu S ={0};

我们定义了这么一个类型的结构体,以及相应类型的结构体变量S,那么我们就可以分析这个变量在内存中怎么存储,首先该结构体第一个成员在相对偏移量为0处开始,占用四个字节,然后是char类型的name在VS环境下默认对齐数是8,对齐数是结构体成员自身的大小,最终对齐数,取其中的小者,即1,对齐数意思是就是,自己必须在结构体已占用内存后开始储存的位置的偏移量必须是自身对齐数的整数倍,前面的age四个字节已经占用了偏移量为3的前面四个字节,所以name的存储从偏移量为4开始判断,4是1的倍数,所以name可以存储在这里。下一个是id,我们自然可以分析它是从偏移量为8开始存储的。那么这个结构体成员就储存完了,大致如图:

关于C语言中结构体在内存中存储的认识_第1张图片

 

        但是最终的内存就是这样了吗,显然不是的,最终的内存大小是由结构体中最大对齐数和最后存储占的绝对空间(即图中有颜色的部分)决定的,我们可以看到这个结构体总共占了十二个格子(包括中间的白格子,中间的白格子就被浪费了),正好是成员最大对齐数的整数倍,那么12字节就是最终结构体所占字节数。 

你可能感兴趣的:(c语言)