范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

结构体的对齐方式以及结构体嵌套指针的使用方法

  结构体数组
  定义结构体数组的方法很简单,同定义结构体变量是一样的,只不过将变量改成数组。或者说同前面介绍的普通数组的定义是一模一样的,如: struct STUDENT stu[10];
  这就定义了一个结构体数组,共有 10 个元素,每个元素都是一个结构体变量,都包含所有的结构体成员。 #define _CRT_SECURE_NO_WARNINGS #include #include #include #include  typedef struct Teacher {     char name[50];     //char* name;     int age; }Teacher; int main() {     Teacher  a[3] = {          {"a",11},         {"b",12},         {"c",13}      };     //静态     Teacher a2[3] = { "aa",13,"bb",12 ,"cc",13};     for (int i = 0; i < 3; i++)     {         printf("%s, %d ", a2[i].name, a2[i].age);     }     int b[3] = { 0 };     int* pB = (int*)malloc(3 * sizeof(int));     free(pB);     //Teacher p[3]     Teacher* p = (Teacher*)malloc(3 * sizeof(Teacher));     if (p==NULL)     {         return -1;     }     char buf[50];     for (int i = 0; i < 3; i++)     {         sprintf(buf, "name%d%d%d", i, i, i);         strcpy(p[i].name, buf);         p[i].age = 20 + i;     }     for (int i = 0; i < 3; i++)     {         printf("第%d个:%s,%d ", i + 1, p[i].name, p[i].age);     }     printf(" ");      if (p!=NULL)     {         free(p);         p = NULL;     }     return 0; }结构体嵌套一级指针#define _CRT_SECURE_NO_WARNINGS #include #include #include #include    typedef struct Teacher {     char* name;     int age; }Teacher;  showTeacher(Teacher* q, int n) {     for (int i = 0; i < n; i++)     {         printf("%s ,%d ", q[i].name, q[i].age);     } }  freeTeacher(Teacher* q, int n) {     for (int i = 0; i < n; i++)     {         if (q[i].name != NULL)         {             free(q[i].name);             q[i].name = NULL;         }     }      if (q != NULL)     {         free(q);         q = NULL;     } }  Teacher* getMem( int n) {      Teacher*q = (Teacher*)malloc(sizeof(Teacher));     //Teacher q[3]     char buf[30];     for (int i = 0; i < n; i++)     {         q[i].name = (char*)malloc(30);         sprintf(buf, "name%d%d%d", i, i, i);         strcpy(q[i].name, buf);          q[i].age = 20 + i;     }     return q; } Teacher* getMem2(Teacher**temp,int n) {     if (temp==NULL)     {         return -1;     }     Teacher* q = (Teacher*)malloc(sizeof(Teacher));     //Teacher q[3]     char buf[30];     for (int i = 0; i < n; i++)     {         q[i].name = (char*)malloc(30);         sprintf(buf, "name%d%d%d", i, i, i);         strcpy(q[i].name, buf);          q[i].age = 20 + i;     }     *temp = q;     return 0; } int main() {     char* name = NULL;     name = (char*)malloc(30);     strcpy(name, "aa");     printf("name=%s ", name);     if (name!=NULL)     {         free(name);         name = NULL;     }      //1     Teacher t;     t.name = (char*)malloc(30);     strcpy(t.name, "s");     t.age = 22;     printf("name=%s  age=%d ", t.name, t.age);     if (t.name!=NULL)     {         free(t.name);         t.name = NULL;     }      //2     Teacher* p = NULL;     p = (Teacher*)malloc(sizeof(Teacher));     p->name = (char*)malloc(30);     strcpy(p->name, "ss");     p->age = 22;     printf("name=%s  age=%d ", p->name, p->age);      if (p->name!=NULL)     {         free(p->name);         p->name = NULL;     }     if (p!=NULL)     {         free(p);         p = NULL;     }        //3     Teacher* q = NULL;     //q = getMem(3);     int ret = 0;     ret = getMem2(&q, 3);     if (ret!=NULL)     {         return ret;     }     showTeacher(q,3);     freeTeacher(q, 3);     p = NULL;     return 0; }结构体嵌套二级指针#define _CRT_SECURE_NO_WARNINGS #include #include #include #include  //一个导师有若干学生 typedef struct Teacher {     int age;     char**stu;//二维内存 }Teacher;  //n1老师个数  n2每个老师带的学生数 int createTeacher(Teacher** temp, int n1,int n2) {     if (temp==NULL)     {         return -1;     }     Teacher* q = (Teacher*)malloc(sizeof(Teacher) * n1);     //Teacher q[3]     for (int i = 0; i < n1; i++)     {         //q[i].stu             //(q+i)->stu         q[i].stu = (char**)malloc(sizeof(char*)*n2);         //char* stu[3]         for (int j = 0; j < n2; j++)         {             q[i].stu[j] = (char*)malloc(30);             char buf[30];             sprintf(buf, "name%d%d%d%d", i, i, j, j);             strcpy(q[i].stu[j], buf);         }         q[i].age = 20 + i;     }          *temp = q;     return 0; }  void showTeacher(Teacher* q, int n1, int n2) {     if (q=NULL)     {         return;     }      for (int i = 0; i < n1; i++)     {         printf("[age=%d]	", q[i].age);         for (int j = 0; j < n2; j++)         {             printf("%s,  ", q[i].stu[j]);         }         printf(" ");     }     printf(" "); }  void sortTeacher(Teacher*p,int n) {     if (p==NULL)     {         return;     }     Teacher temp;     for (int i = 0; i < n-1; i++)     {         for (int j = i+1; j < n; j++)         { 			if (p[i].age < p[j].age)//降序             {                 temp = p[i];                 p[i] = p[j];                 p[j] = temp;             }         }     }  }  void freeTeacher(Teacher** temp, int n1, int n2) {     if (temp==NULL)     {         return;     }     Teacher* q = *temp;     for (int i = 0; i < 3; i++)     {         for (int j = 0; j < 3; j++)         {             if (q[i].stu[j] != NULL)             {                 free(q[i].stu[j]);                 q[i].stu[j] = NULL;             }         }         if (q[i].stu != NULL)         {             free(q[i].stu);             q[i].stu = NULL;             *temp = NULL;         }     }       if (q != NULL)     {         free(q);         q = NULL;     } }  int main() {      char** name = NULL;     //char* name[3]     int n = 3;     name = (char**)malloc(sizeof(char*) * 3);     for (int i = 0; i < n; i++)     {         name[i] = (char*)malloc(30);         strcpy(name[i], "aaa");     }     for (int i = 0; i < n; i++)     {         printf("%s ", name[i]);     }      for (int i = 0; i < n; i++)     {         if (name[i]!=NULL)         {             free(name[i]);             name[i] = NULL;         }     }     if (name!=NULL)     {         free(name);         name = NULL;     }       //1     Teacher t;     //t.stu[3]      //char* t.stu[3]     int n = 3;     t.stu = (char**)malloc(sizeof(char*) * 3);     for (int i = 0; i < n; i++)     {         t.stu[i] = (char*)malloc(30);         strcpy(t.stu, "aaa");     }     for (int i = 0; i < n; i++)     {         printf("%s ",t.stu[i]);     }      for (int i = 0; i < n; i++)     {         if (t.stu[i] != NULL)         {             free(t.stu[i]);             t.stu[i] = NULL;         }     }     if (t.stu != NULL)     {         free(t.stu);         t.stu = NULL;     }       //2     Teacher* p = NULL;     //p->stu[3]     p = (Teacher*)malloc(sizeof(Teacher));      //char* t.stu[3]     int n = 3;     p->stu = (char**)malloc(sizeof(char*) * 3);     for (int i = 0; i < n; i++)     {         p->stu[i] = (char*)malloc(30);         strcpy(p->stu, "aaa");     }     for (int i = 0; i < n; i++)     {         printf("%s ", p->stu[i]);     }      for (int i = 0; i < n; i++)     {         if (p->stu[i] != NULL)         {             free(p->stu[i]);             p->stu[i] = NULL;         }     }     if (p->stu != NULL)     {         free(p->stu);         p->stu = NULL;     }      if (p!=NULL)     {         free(p);         p = NULL;     }      //3     Teacher* q = NULL;     int ret = 0;     ret = createTeacher(&q, 3,3);     //Teacher* q[3]     //q[i].stu[3]     printf("排序前 ");     showTeacher(q, 3, 3);      sortTeacher(q, 3);     printf("排序后 ");     showTeacher(q,3,3);      freeTeacher(&q, 3, 3);       return 0; } 结构体的深拷贝与浅拷贝#define _CRT_SECURE_NO_WARNINGS #include #include #include #include   typedef struct Teacher {     char* name;     int age; }Teacher;  //结构体中嵌套指针,而且动态分配空间 //同类型结构体变量赋值 //结构体成员指针变量指向同一块内存 int main() {     Teacher t1;     t1.name = (char*)malloc(30);     strcpy(t1.name, "tom");     t1.age = 22;      Teacher t2;     t2 = t1;     //深拷贝,人为增加内容,重新拷贝一下     t2.name= (char*)malloc(30);     strcpy(t2.name, t1.name);      printf("[t2]%s,%d ", t2.name, t2.age);      if (t1.name!=NULL)     {         free(t1.name);         t1.name = NULL;     }     //重复释放       //浅拷贝:t2的值还指向同一块内存 t1.name  t1释放后t2又释放 导致出现错误     if (t2.name != NULL)     {         free(t2.name);         t2.name = NULL;     }     return 0; } 结构体的对齐方式
  结构体的对齐公式:
  记住以下这些规则,把结构体往里面套就可以了。结构体对齐的原则就是牺牲空间的方式来减少时间的消耗,空间用完还可以复用,而时间过去了就再也不会回来了。  以 #pragma pack(x) 中 x 的大小和结构中占用空间最大的成员做比较,取小值为 n(外对齐依据)  以 n 值和结构体每个成员比较,得到结果列表为 m[x]  根据每个成员的大小依次向内存中填充数据,要求填充 成员的起始地址 减去 构体起始地址 的差都可以整除 m[x] ,如不能整除则向后移动,直到可以整除再填充成员到内存(内对齐依据)  当全部成员填充完毕后所占用的字节若不能整除 n,则扩充内存到可以整除 n 为止。
  举个例子:
  在这个例子中struct data的大小为8个字节。

卡西欧经典金属手表跌破心理价位虽然现在智能手表大行其道,但传统的卡西欧电子表在年轻人中依然有着极高的人气。特别是以经典型号5600衍生出来的产品更是如此。今天笔者在京东商城卡西欧自营店看到,金属方块GM5600研究自动驾驶卡车将取代美国50万就业岗位来源盖世汽车星云盖世汽车讯据外媒报道,机器人将会率先取代那些最无聊最危险的人类工作,卡车行业也不例外。在自动驾驶工程师眼中,美国的州际高速公路几乎没有任何难度,因此这条线路十分适合解码康乃馨花色花香关键基因近日,中国农业科学院深圳农业基因组研究所武志强团队,联合华中农业大学傅小鹏团队对康乃馨栽培品种斯嘉丽进行了全基因组测序和组装,并鉴定到调控康乃馨花色和花香的关键基因,为解析康乃馨重电脑DIY提高生产力,用带鱼屏还是组双屏?纠结2年的我终于有答案电脑DIY提高生产力,用带鱼屏还是组双屏?纠结2年的我终于有答案了1纠结是现代人的常态一直在纠结,提高生产力,究竟是用带鱼屏还是组双屏?相信很多人和我一样,都有这样的困扰。为什么需洗碗机买了会后悔吗?用了一年多的时间,谈谈我的使用感受要说这几年争议性最大的家用电器,洗碗机肯定算一个!许多人觉得洗碗机是智商税,洗那么久还不如自己手洗,浪费钱又占地方。但也有很多人把洗碗机同扫地机烘干机并列,称为当代幸福生活三件套。这4种家电,越高级反而越鸡肋,建议选普通款就好现在家电市场发展迅猛,无论是线上还是线下,同品牌同种类的家电都有不同的价格,适合不同层次的消费人群。有人说,家电当然越贵越好,一分钱一分货。但是,我认为,家电应该只选对的,不选贵的为什么越来越多人,开始选择空气能热水器?它哪里优秀呢?为什么越来越多人,开始选择空气能热水器?它哪里优秀呢?不知道大家有没有注意到,现在空气能热水器变得越来越普遍,很多朋友都变成了空气能热水器的忠实用户。之前只有南方的朋友会特别愿意选不是特斯拉不够硬,而是蔚来这次实在是太强了如果将时间拉回到七八年之前,那时候的燃油车相对还没什么压力,毕竟对于碳排放的控制,还没有现在这么严苛。然而,中国有句成语叫做先见之明,这一点特斯拉就做得比较好。比如在新能源领域,国鞭牛晚报原神就充值异常致歉高阶显卡报价雪崩特斯拉柏林超级工厂开工编者按鞭牛士将以晚报形式盘点今日内发生的重要事件,内容涵盖国际国内科技互联网,为科技行业从业者用户传递行业信息。国内新闻1原神就游戏充值异常问题致歉今日,米哈游原神官微就游戏充值异关注特斯拉退一赔三案二审败诉后申请再审,请求撤销判决文懂车帝原创彩丽美懂车帝原创行业日前,特斯拉汽车销售服务(北京)有限公司被曝出已于3月14日向被申请人韩某提起再审申请书。据再审申请书内容显示,申请人特斯拉汽车销售服务(北京)有限欧界丨前魅族系统工程师重返微博欧界报道3月18日,前魅族工程师洪汉生重返微博,证实自己早已跳槽OPPO,目前在OPPO负责软件技术规划与架设,回归微博是为了倾听用户声音。一条简简单单的微博,却勾起互联网的记忆,
硬核罗技狗屁王二代PROXSUPERLIGHT鼠标精准度测试罗技GPW(PROWIRELESS),俗称狗屁王,是一款具有里程碑意义的游戏鼠标,它最大的价值在于解决了无线游戏鼠标的重量续航两大难题,开先河并领先行业2年以上。硬件上的成功加上罗七夕快到了,币价不再是那个币价,你还是那个单身的你!今天的币市依然是一片红,只有和美元同进退的泰达(USDT)还坚强的绿着,世界警察还是厉害啊。有人欢喜有人愁,土耳其的法币就没有这么坚挺一个月前一个月后别看数字货币跌的惨,比起持有自手机修图Snapseed秘籍(二)创意相框篇(二)文字创意相框我前几天发表了几张使用Snapseed制作的新颖相框,许多朋友都问我是怎么制作出来的,因为在Snapseed中根本就没有这样的相框,估计没人知道怎么去制作,今天我教你使用Snapseed制作风景国画风景如画Snapseed也可以在网上有许多使用软件制作国画和水墨画的教程,但是相对都比较简单,有的甚至把彩色变成黑白就说是水墨画,其实没那么简单,最起码你的制作要有神似,要不然根本区块链世界!三分钟带妈妈读懂区块链挖矿Skr啥?今天狗编麻麻突然问狗编你最近在忙啥呢,常常不着家?狗编悠悠说道忙着研究挖矿呢母上大人终于关心了一下儿子的行踪,确认过眼神,是亲生的。啥?挖矿?咱这还有矿洞?狗编此矿非彼矿,我这研究小K测评第三期讯景RX470黑狼讯景RX4704G黑狼显卡一直被称呼为RX470系列显卡的乞丐版,小K觉得有必要为它平反一下,这一期就为大家带来讯景RX4704G黑狼尔必达颗粒(下文统称RX474)的测评,并简单Fomo3D,是兄弟就别买我互联网界的另一位大佬李彦宏也出手封杀ICO了。继腾讯阿里巴巴两大互联网巨头掐断数字货币的场外支付渠道后,百度也加入了对币圈的全面封锁,往日热闹的数字货币吧虚拟货币吧等贴吧被全部封禁区块链世界!用延禧攻略带小白女友看懂区块链!2018最火的宫廷剧是什么?毋庸置疑一定是延禧攻略挤着公交都能看到各个小姐姐缩着身子看剧那些宣称打死也不看于妈新剧的人还不是看的意犹未尽!2018最火的科技关键词是什么?区块链绝对菜鸟驿站发布新成长计划未来三年要让站点平均收入翻倍6月10日,菜鸟全球智慧物流峰会在杭州举行,菜鸟驿站发布新成长计划,计划在包裹代收之外通过丰富社区服务内容,三年内让站点年平均收入翻倍。现场,新成长计划由10名来自全国各地的站长代新华保险杭州中支童心向党,集体献礼公益联欢会进行时在建党一百周年即将来临之际,一场以童心向党,集体献礼为主题的公益联欢会在杭州市临平区星桥镇欢乐举行。活动由7家机构联合发起赞助,旨在搭建亲子交流的平台,同时寓教于乐,增强孩子们爱国新华保险杭州中支开展不忘初心,守护美好公益健步走活动为积极响应中国保险行业协会2021年7。8全国保险公众宣传日活动号召,新华保险杭州中支与中国大地保险杭州中支联合开展不忘初心,守护美好公益健步走活动,为公益前行,为保险发声。今年是