当前位置: 首页 > news >正文

C语言——结构体类型(二)【结构体内存对齐,结构体数组】

📝前言:
上一讲结构体类型(一)中,我们讲述了有关结构体定义,创建,初始化和引用的内容,这一讲,我们进一步学习结构体的相关知识:
1,结构体内存对齐
2,结构体数组

🎬个人简介:努力学习ing
📋个人专栏:C语言入门基础
🎀CSDN主页 愚润求学
🌄每日鸡汤:山高路远,看世界,也找自己!


文章目录

  • 一,结构体内存对齐
    • 1,基本知识
    • 2,例子分析
  • 二,结构体数组
    • 1,什么是结构体数组
    • 2,结构体数组的初始化

一,结构体内存对齐

1,基本知识

🔍问题引导:
我们都知道sizeo(变量类型))可以得到一个变量所占内存的大小,那么,请看下面这串代码👇🏻

#include<stdio.h>
struct stu1
{char a;int b;char c;
};
struct stu2
{int b;char c;char a;
};
int main()
{printf("%d\n", sizeof(struct stu1));printf("%d\n", sizeof(struct stu2));return 0;
}

输出结果是什么呢?
猜测:两个结构体里面都是两个char,一个int,那他们的内存大小应该一样吧
但是,输出结果👇🏻
在这里插入图片描述
很显然,尽管这两个结构体变量的成员差不多,但是这两个结构体变量的大小却不一样。
这就是因为结构体类型的变量在开辟内存的时候,要遵循结构体内存对齐,只有对齐到符合的地址处时,才会开始为成员分配内存

在了解如何对齐前,我们先来了解对齐数这个概念👇🏻

① 一个变量的对齐数 = 编译器默认的对齐数 与 该成员变量大小之间的较小值
②如果嵌套了结构体类型的成员,则这个成员的对齐数就是 这个嵌套的结构体的自身成员中的最大对齐数
VS中默认的对齐数是8
Linuxgcc没有默认对齐数(即对齐数就是成员变量的自身大小)

🔍接下来我们就来介绍一下结构体内存对齐的规则:
1,结构体的第一个成员对齐到与结构体变量起始位置的偏移量为0的地址处(简单来说就是第一个成员变量的内存从起始位置开始分配
2,其他成员变量要对齐到 与起始位置的偏移量为这个变量的对齐数的整数倍的地址处,然后再开始分配内存
3,结构体的总大小应该为 所有成员中最大对齐数 的整数倍

2,例子分析

我们计算结构体的大小的一般流程如下👇🏻
在这里插入图片描述
了解了上面的知识以后,我们再来分析几个例子:
例1:(为什么:stu1是12,stu2是8?)

struct stu1
{char a;int b;char c;
};
struct stu2
{int b;char c;char a;
};

我们用上面步骤对stu1进行分析:
在这里插入图片描述
具体分配(stu1):
在这里插入图片描述
同理,我们可以得到stu2的分配情况:
在这里插入图片描述
例2(当有结构体成员):

#include<stdio.h>
struct date
{int year;int month;int day;
};
struct stu
{char name[10];int age;char sex;struct date birthday;
};
int main()
{printf("%d", sizeof(struct stu));return 0;
}

运行结果:
在这里插入图片描述
要注意的有以下两点:
1,嵌套的结构体成员birthday的对齐数
2,birthday成员的大小,birthday也是一个结构体,也要用结构体内存对齐的方式来计算大小
具体分配如下:
在这里插入图片描述

二,结构体数组

1,什么是结构体数组

结构体数组,顾名思义就是数组元素是结构体的数组

结构体类型的数组的定义形式:
struct 结构体类型名 数组名[数组长度];

例如(定义一个能保存3个学生信息的结构体数组)👇🏻

struct student
{char name[10];int age;char sex;
};
struct student stu[3];

其数组元素各成员的引用形式为:

stu[0].name[i], stu[0].age, stu[0].sex //引用第一个
stu[1].name[i], stu[1].age, stu[1].sex //引用第二个

2,结构体数组的初始化

数组总的元素用花括号{ }括起来,在括号内再用花括号{}对单个结构体元素的多个成员进行初始化,每个数组元素之间用逗号隔开
(多成员初始化就用:花括号{})
●在定义的时候初始化

    struct student stu[3] ={{"zhangsan",18,'B'},{"lisi",20,'G'},{"wangwu",30,'B'}};

最外层的{}代表数组里面有多个元素,内层的{}代表一个结构体里面有多个成员

●利用.操作符进行初始化

struct student stu[3] ={{.name="zhangsan",.age=18,.sex='B'},{.name="lisi",.age=20, .sex='G'},{.name="wangwu",.age=30,.sex='B'}};

●如果是部分初始化,未被初始化的就会被默认初始化为0

int main()
{
struct student stu[3] ={{.name="zhangsan",.age=18,.sex='B'},{.name="wangwu",.age=30,.sex='B'}};printf("%s\n", stu[2].name);printf("%d\n", stu[2].age);printf("%c", stu[2].sex);return 0;
}

运行结果:
在这里插入图片描述
stu[3]的初始化情况:
在这里插入图片描述


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

相关文章:

  • 美客多本土店与跨境店有何区别?本土店如何入驻运营?
  • IPv6邻居发现协议(NDP)---路由发现
  • Web缓存代理
  • 【算法】七夕祭
  • What does `$?` do?
  • C# 语法进阶 委托
  • 基于web的电影院购票系统
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • vue项目使用typescript创建抽象类及其使用
  • 全链路压力测试有哪些主要作用
  • 虽然是个去年的旧新闻,但这透露了IBM的新去向
  • docker/华为云cce 部署nacos 2.3.0 集群模式
  • sqlilabs第四十九五十关
  • Laravel 使用rdkafka_laravel详细教程(实操避坑)
  • Google上架:2024年一月政策限制之 AI 生成的内容
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • ➹使用webpack配置多页面应用(MPA)
  • css选择器
  • Docker: 容器互访的三种方式
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • JavaScript异步流程控制的前世今生
  • Joomla 2.x, 3.x useful code cheatsheet
  • learning koa2.x
  • Vue 2.3、2.4 知识点小结
  • Web标准制定过程
  • 程序员该如何有效的找工作?
  • 初识 webpack
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 区块链分支循环
  • 通过npm或yarn自动生成vue组件
  • 想写好前端,先练好内功
  • 小程序开发中的那些坑
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #Linux(make工具和makefile文件以及makefile语法)
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)正点原子I.MX6ULL u-boot移植
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • **PHP分步表单提交思路(分页表单提交)
  • 、写入Shellcode到注册表上线
  • .gitignore文件_Git:.gitignore
  • .Net 6.0 处理跨域的方式
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET轻量级ORM组件Dapper葵花宝典
  • .Net组件程序设计之线程、并发管理(一)
  • [ solr入门 ] - 利用solrJ进行检索
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [C++]打开新世界的大门之C++入门
  • [C++随笔录] 红黑树
  • [iOS开发]事件处理与响应者链