首页 > 其他分享 >C语言结构体对齐,超详细,超易懂

C语言结构体对齐,超详细,超易懂

时间:2023-02-04 12:45:02浏览次数:53  
标签:struct int printf C语言 char 易懂 对齐 sizeof size

结构体对齐规则
结构体的第一个成员总是存放在结构体变量开辟的空间的起始地址
其它成员变量要存储在一个名叫对齐数的整数倍的地址
结构体总大小为最大对齐数的整数倍,结构体内每一个变量都会产生一个对齐数,取其最大的对齐数
如果是嵌套结构体,那么嵌套的结构体存储在嵌套结构体的成员的最大对齐数的整数倍地址处,包含嵌套结构体的结构体大小为自己成员的对齐数和嵌套结构体的成员的对齐数的最大对齐数的整数倍
结构体Tmp与结构体Cmd,结构体Msg的变量在内存的存放位置
结构体Tmp,大小为12

 

结构体Cmd,大小为8

 

结构体Msg,大小为8

 

示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct Tmp
{
char c1;
int a;
char c2;
};

struct Cmd
{
char c1;
char c2;
int a;
};

struct Msg
{
int a;
char c1;
char c2;
};

int main(int argc,char *argv[])
{
struct Tmp t;
struct Cmd c;
struct Msg m;

memset(&t,0,sizeof(struct Tmp));
memset(&c,0,sizeof(struct Cmd));
memset(&m,0,sizeof(struct Msg));

printf("int size is %ld\n",sizeof(int)); //4
printf("char size is %ld\n",sizeof(char)); //1
printf("int* size is %ld\n",sizeof(int *)); //8
printf("char* size is %ld\n",sizeof(char *)); //8

printf("Tmp struct size is %ld\n",sizeof(struct Tmp)); //12
printf("Tmp struct variable size is %ld\n",sizeof(t)); //12
printf("Cmd struct size is %ld\n",sizeof(struct Cmd)); //8
printf("Cmd struct variable size is %ld\n",sizeof(c)); //8
printf("Msg struct size is %ld\n",sizeof(struct Msg)); //8
printf("Msg struct variable size is %ld\n",sizeof(m)); //8

return 0;
}

嵌套结构体对齐
嵌套结构体Msg1,大小为20


嵌套结构体Msg2,大小为16

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Tmp // size = 12
{
char c1;
int a;
char c2;
};

struct Cmd // size = 8
{
char c1;
char c2;
int a;
};

struct Msg1
{
int a;
char c1;
char c2;
struct Tmp t;
};

struct Msg2
{
int a;
char c1;
char c2;
struct Cmd c;
};

int main(int argc, char *argv[])
{
struct Tmp t;
struct Cmd c;
struct Msg1 m1;
struct Msg2 m2;

memset(&t, 0, sizeof(struct Tmp));
memset(&c, 0, sizeof(struct Cmd));
memset(&m1, 0, sizeof(struct Msg1));
memset(&m2, 0, sizeof(struct Msg2));

printf("Msg1 struct size is %ld\n", sizeof(struct Msg1)); // 20
printf("Msg1 struct variable size is %ld\n", sizeof(m1)); // 20

printf("Msg2 struct size is %ld\n", sizeof(struct Msg2)); // 16
printf("Msg2 struct variable size is %ld\n", sizeof(m2)); // 16

return 0;
}
https://blog.csdn.net/weixin_54076783/article/details/126694593

https://blog.csdn.net/qq_67838572/article/details/126918769

标签:struct,int,printf,C语言,char,易懂,对齐,sizeof,size
From: https://www.cnblogs.com/htu2021/p/17091276.html

相关文章

  • 【C语言 数据结构】数组与对称矩阵的压缩存储
    文章目录​​数组的定义​​​​数组的顺序表示和实现​​​​顺序表中查找和修改数组元素​​​​矩阵的压缩存储​​​​特殊矩阵​​​​稀疏矩阵​​数组的定义提到数组......
  • 模拟实现不受限制的字符串函数--C语言版
    C语言中提供了许多十分好用的库函数,一旦我们掌握了它们,我们使用C语言写代码就会变得更加得心应手。1.strlenstrlen函数就是计算字符串的长度的,它会一直读取到\0,它的返回值就......
  • 二分查找——C语言描述
    二分查找——C语言描述目录二分查找——C语言描述0测试用例框架1定义2代码4测试用例0测试用例框架https://blog.csdn.net/m0_59469991/article/details/127137119?......
  • 冒泡排序——C语言描述
    冒泡排序——C语言描述目录冒泡排序——C语言描述0测试用例框架1定义2代码4测试用例0测试用例框架https://blog.csdn.net/m0_59469991/article/details/127137119?......
  • C语言-猜数游戏
    整理文件发现以前写的C语言猜数游戏1-效果演示2-程序#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){ srand(time(0)); intnumber=rand......
  • C语言笔记
    分支语句(选择结构)1.if语句悬空else(else只会与离他最近的未匹配的if匹配!)就近原则养成习惯,每个if后加{}intmain(){ inta=0; intb=2; if(a==1) if(b==......
  • 【C语言】程序的翻译环境和执行环境
    ......
  • C语言-链表流星雨(EsayX)
    刷B站看到的,做个玩玩。IDE:VisualStudio2022。依赖EsayX图形库1-效果 2-程序/*链表流星雨单文件版本依赖EsayX图形库*/#include<stdio.h>#include<stdlib.h>......
  • C语言小项目-通讯录的实现
    contact.h#defineMAX1000#defineMAX_NAME20#defineMAX_SEX5#defineMAX_TELE12#defineMAX_ADDR30enumopt{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT};......
  • 枚举以及联合体--C语言版
    枚举的定义枚举顾名思义就是一一列举。把可能的取值一一列举。一周的星期一到星期日是有限的7天,可以一一列举。性别有:男、女、保密,也可以一一列举。月份有12个月,也可以......