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

这篇具有很好参考价值的文章主要介绍了C语言——结构体类型(二)【结构体内存对齐,结构体数组】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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


一,结构体内存对齐

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,那他们的内存大小应该一样吧
但是,输出结果👇🏻
C语言——结构体类型(二)【结构体内存对齐,结构体数组】,C语言入门基础,c语言,算法,开发语言,学习方法,笔记,经验分享
很显然,尽管这两个结构体变量的成员差不多,但是这两个结构体变量的大小却不一样。
这就是因为结构体类型的变量在开辟内存的时候,要遵循结构体内存对齐,只有对齐到符合的地址处时,才会开始为成员分配内存

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

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

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

2,例子分析

我们计算结构体的大小的一般流程如下👇🏻
C语言——结构体类型(二)【结构体内存对齐,结构体数组】,C语言入门基础,c语言,算法,开发语言,学习方法,笔记,经验分享
了解了上面的知识以后,我们再来分析几个例子:
例1:(为什么:stu1是12,stu2是8?)

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

我们用上面步骤对stu1进行分析:
C语言——结构体类型(二)【结构体内存对齐,结构体数组】,C语言入门基础,c语言,算法,开发语言,学习方法,笔记,经验分享
具体分配(stu1):
C语言——结构体类型(二)【结构体内存对齐,结构体数组】,C语言入门基础,c语言,算法,开发语言,学习方法,笔记,经验分享
同理,我们可以得到stu2的分配情况:
C语言——结构体类型(二)【结构体内存对齐,结构体数组】,C语言入门基础,c语言,算法,开发语言,学习方法,笔记,经验分享
例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;
}

运行结果:
C语言——结构体类型(二)【结构体内存对齐,结构体数组】,C语言入门基础,c语言,算法,开发语言,学习方法,笔记,经验分享
要注意的有以下两点:
1,嵌套的结构体成员birthday的对齐数
2,birthday成员的大小,birthday也是一个结构体,也要用结构体内存对齐的方式来计算大小
具体分配如下:
C语言——结构体类型(二)【结构体内存对齐,结构体数组】,C语言入门基础,c语言,算法,开发语言,学习方法,笔记,经验分享

二,结构体数组

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;
}

运行结果:
C语言——结构体类型(二)【结构体内存对齐,结构体数组】,C语言入门基础,c语言,算法,开发语言,学习方法,笔记,经验分享
stu[3]的初始化情况:
C语言——结构体类型(二)【结构体内存对齐,结构体数组】,C语言入门基础,c语言,算法,开发语言,学习方法,笔记,经验分享


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

到了这里,关于C语言——结构体类型(二)【结构体内存对齐,结构体数组】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言高阶篇】结构体 —— 什么是内存对齐?

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,今天给大家带来的是结构体的内存对齐这部分知识,可以说是干货满满啦!    ⛳️ 在我们C语言的面试题中,结构体最

    2024年02月14日
    浏览(51)
  • C语言如何计算结构体大小(结构体的内存对齐)

    结构体的内存对齐是有关结构体内容的很重要一个知识点,主要考察方式是计算结构体的字节大小。 当我们对计算结构体一无所知,我们不妨自己思索如何计算,是不是直接计算结构体成员变量占用内存的大小呢? 那我们先举个例子  观察发现结构体的大小计算跟我们想的

    2024年02月16日
    浏览(44)
  • 结构体占用内存大小如何确定?-->结构体字节对齐 | C语言

    目录 一、什么是结构体 二、为什么需要结构体 三、结构体的字节对齐 3.1、示例1 3.2、示例2 3.3、示例3  3.4、示例4 3.5、示例5 四、结构体字节对齐总结         结构体是将不同类型的数据按照一定的功能需 求进行整体封装,封装的数据类型与大小均可以由用户指定。 结

    2024年01月17日
    浏览(46)
  • 【C语言】什么是结构体内存对齐?结构体的大小怎么计算?

      目录 1.结构体内存对齐 对偏移量的理解:​ 2.结构体的大小计算 2.1结构体中只有普通的数据类型的大小计算 2.2 结构体中有嵌套的结构体的大小计算 3.修改默认对齐数 4.为什么存在内存对齐? 这篇文章主要介绍结构体内存对齐和如何计算大小。 在学习结构体内存对齐之前,

    2024年02月11日
    浏览(50)
  • 【C语言13】结构体的声明,定义与结构体的内存对齐

    通俗的说,结构体就是一个类的集合,如同整形数组是整形数字的集合体,结构体也是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 如果我们要表达一本书,那么这本书的元素有什么呢,书的名字,书的作者,书的创作日期~,而c语言中内置

    2024年02月13日
    浏览(68)
  • C语言结构体字节对齐(内存对齐)之#pragma pack和__attribute__((packed)的使用

    在不使用 #pragma pack 和 __attribute__((packed) 等选项来自定义字节对齐大小的情况下,关于正常字节对齐的描述,可参考博文: C/C++计算类/结构体和联合体(union)所占内存大小(内存对齐问题)_联合体占用的内存空间_SOC罗三炮的博客-CSDN博客 同学可以尝试将char f 注释,最后将

    2024年02月12日
    浏览(45)
  • 【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,今天给大家带来的是结构体的内存对齐这部分知识,可以说是干货满满啦!    ⛳️ 在我们C语言的面试题中,结构体最

    2024年02月16日
    浏览(46)
  • 【C语言】自定义类型:结构体【结构体内存具详细】,枚举,联合

      目录 一、结构体 1.结构的声明  2.特殊的声明 3.结构的自引用 4.结构体变量的定义和初始化   5.结构体内存对齐(重点来了) 6.为什么会存在内存对齐  7.修改默认对齐数 8.结构体传参 二、位段 1.什么是位段 2.位段的内存分配 3.位段的跨平台问题 三、枚举 1.枚举类型的定

    2024年02月07日
    浏览(47)
  • C语言自定义数据类型(二)使用结构体数组

    一个结构体变量中可以存放一组有关联的数据(如一个学生的学号、姓名、成绩等数据)。如果有 10 个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组的不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别

    2024年01月19日
    浏览(46)
  • Java 基础入门篇(三)—— 数组的定义与内存分配

    数组就是一个容器,用于在程序中存储一批同种类型的数据。 使用场景:一旦确定了数据的具体值,我们就用这种方式存储批量数据。 使用场景:适合做一开始不能确定具体数据的情况。先定义数组,后赋值数据进去。 动态初始化数组的元素存在默认值: 注: 数据类型[

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包