前言
sizeof怎么用?结构体的对齐规则怎么去理解?
一、sizeof的作用与用法
1.sizeof是运算符,并非函数;
2.作用:计算一种类型(int..数组..结构体..之类)的字节数,返回一个无符号长整型数;
3.与strlen的区别:3.1.strlen算的是数组的实际长度,不包括'\0';
3. 2.strlen是在string.h中的函数,sizeof是运算符;
3.3.sizeof不能通过指针去计算它指向的内存块大小;
二、代码示例
1.sizeof的使用(64位下)
#include <stdio.h>
#include <string.h>
int main()
{
//计算类型
printf("64位--char-%ld\n",sizeof(char));//1
printf("64位--int-%ld\n",sizeof(int));//4
printf("64位--long-%ld\n",sizeof(long));//8
printf("64位---short int-%ld\n",sizeof(short int));//2
printf("64位置--float-%ld\n",sizeof(float));//4
//计算数组
char str[]="woaini";//初始化为字符串数组,字符串后面会自动添加一个‘\0’;
char spr[]={'a','b'};//
int num_1[]={1,2,3};
int num_2[5];
printf("%ld--%ld--%ld--%ld\n",sizeof(str),sizeof(spr),sizeof(num_1),sizeof(num_2));
}
2.结构体的对齐规则
用的是我自己的语言,所以可能不准确,但是我觉得能让人看的懂;
//计算结构体大小
/*存在一种对齐规则:
1.先找到结构体里面最大的类型;
2.按照最大的类型长度为模板,按声明的顺序排列,能够放下的放在同一行,否则另起一行;
3.结构体的大小=最大的类型*行数
*/
struct class
{
int age;
char bg;
short int b;
int a;
float hight;
long student_num;
}jpf;
/* 64位下!
1.jpf这个结构体变量中long是最大的,长度为8,所以每一行的长度空间为8;
2.按照申明顺序开始排列:
第一个是int型,长度为4,小于8放进第一行,此时第一行还有4个字节的长度;
第二个是char型长度为1,第一行还有4个字节可用,能放下,放入第一行,此时第一行还有3个字节长度;
第三个是short int型,长度为2,第一行还有3个字节可用,能放下,放入第一行,此时第一行只有1字节了;
第四个是int型,长度为4,第一行只有1个字节了,放不下,放到第二行,此时第二行还有4个字节可用;
第五个是float型,长度为4,第二行还有4个字节,刚好,能放下!放入第二行,第二行用完;
第六个是long型,另起一行,长度为8,刚好用完第三行
3.所以jpf结构体=8*3=24*/
总结
以上就是我对sizeof的一些认识,以及对结构体对齐的解释,我也是没学多久,想着通过记录这样去积累,学习,一直在路上!欢迎大家跟我对话交流,一起学习进步!