C语言结构体求大小
引入一个知识,我这里会写的比较少,大家可以打开自己的课本查看。
1、结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍。(对齐)
2、结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节的整数倍。(对齐)
3、结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍(补齐)
下面是一些例子,博主带大家来计算大小┗|`O′|┛ 嗷~~ (别看俺的字丑,俺其实可温柔了)
首先是不含指针(有数组的情况下,且数组大小不为0)
//
// Created by 18751 on 2023/5/30.
//
#include<stdio.h>typedef struct struct1{int first; //首先是int4字节double second;//下来的基本数据类型是double8个字节,但是这个结构体成员之前。只有四个字节,我们补足内存大小到这个成员基本数据类型的整数倍,即在int的基础上加4char third[5];//基本数据类型位char,直接加5.现在是21int fouth[3];//基本数据类型为int,补足内存到24然后+12
}struct1;//例一//到这里还没有结束,因为最大数据类型为8,所以最终的结果也要是8的整数倍,向上取整。就到了40
int main(){struct1 example1;printf("%d",sizeof(example1));
}
有指针的情况的话,32位和64位指针大小分别为4和8字节,与上面一样
下面是包含柔性数组的结构体
因为柔性数组本身是无法确定有几个字节的,所以计算整体结构体大小时,会省略柔性数组的计算。在使用的时候分配内存就可以。
//
// Created by 18751 on 2023/5/30.
//
#include<stdio.h>typedef struct struct1{int first;double second;char third[5];int fouth[3];int fifth[0];
}struct1;int main(){struct1 example1;printf("%d",sizeof(example1));
}