哲♂学家带你深♂入了♂解结构体及结构体内存大小问题

目录

概要

一、结构体的声明

二、结构体变量的创建和初始化

三、结构体的特殊声明

四、结构体内存对齐

1、对齐原则

2、例一

对齐数

计算方法

3、例二 

总结


概要

结构体是我们日常编程中经常要用到的一种自定义类型,使用起来也是十分的方便。接下来就由本哲♂学家带领你们深♂入了解结构体。

一、结构体的声明

struct tag
{member-list;
}variable-list;

二、结构体变量的创建和初始化

#include <stdio.h>
struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
};
int main()
{//按照结构体成员的顺序初始化struct Stu s = { "张三", 20, "男", "20230818001" };printf("name: %s\n", s.name);printf("age : %d\n", s.age);printf("sex : %s\n", s.sex);printf("id : %s\n", s.id);//按照指定的顺序初始化struct Stu s2 = { .age = 18, .name = "lisi", .id = "20230818002", .sex = "⼥printf("name: %s\n", s2.name);printf("age : %d\n", s2.age);printf("sex : %s\n", s2.sex);printf("id : %s\n", s2.id);return 0;
}

三、结构体的特殊声明

//匿名结构体类型
struct
{int a;char b;float c;
}x;

以上结构体声明时候省略掉了结构体标签。

对于匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使用一次。所以尽量不要用。

四、结构体内存对齐

1、对齐原则

1. 结构体的第⼀个成员对齐到和结构体变量起始位置偏移量为0的地址处
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
        对齐数 = 编译器默认的⼀个对齐数 与 该成员变量大小的较小值。
VS 中默认的值为 8
- Linux中 gcc 没有默认对齐数,对齐数就是成员自身的大小
3. 结构体总大小为最大对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最大的)的
整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构
体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。
这么说有点晦涩难懂,接下来给大家几个例子了解。

2、例一

//练习1
struct S1
{char c1;int i;char c2;
};

首先我们了解一下什么是对齐数:

对齐数

指某一个元素的初始指针与结构体的初始指针的差值,举个例子,因为c1指针和结构体初始指针一样,所以c1的对齐数是0;

计算方法

对于结构体第一个变量我们是不用考虑c1的偏差值,直接存放,根据对齐规则,i要放在4的倍数的位置,即偏差值为4的位置,c2是char类型所以可以随便放(任何数都是1的倍数),所以这个在内存中是这么放的:

所以总大小为9但其成员最大对齐数是4,5不是4的倍数,所以最终内存大小为12字节。 

3、例二 

//练习2
struct S1
{char c1;int i;char c2;
};
struct S4
{char c1;struct S1 s1;int d;
};

由上面知道s1大小为12,其中它的成员最大对齐数为4,所以待会对齐到4的倍数那所以其在内存存放是这样的:

总大小为20,其中最大对齐数为4,而20是4的倍数,所以这个结构体大小为20字节。

总结

结构体的使用其实对我们来说并不难,难的是如何计算其大小,需要我们熟练掌握其对齐原则。

期待与你们一起van♂。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/763716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机二级Python题目3

题目来源&#xff1a;计算机二级Python半个月抱佛脚大法&#xff08;内呈上真题版&#xff09; - 知乎 目录 1. 基础题 1.1 基础题1 1.2 基础题2 1.3 基础题3 2. turtle绘图题 3. 大题 3.1 大题1 3.2 大题2 1. 基础题 1.1 基础题1 a,b,ceval(input()) ls[] for i in …

2核4G服务器优惠价格和性能测试,2024年

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

Jmeter测试计划

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

P2799 国王的魔镜

题目链接&#xff1a;国王的魔镜 - 洛谷 题目难度&#xff1a;普及- 涉及知识点&#xff1a;判断回文 题意&#xff1a; 分析&#xff1a;先判断是否是2的倍数&#xff0c;再判断回文 AC代码&#xff1a; #include<bits/stdc.h> using namespace std; char a[10000…

diffusion model(十四): prompt-to-prompt 深度剖析

infopaperPrompt-to-Prompt Image Editing with Cross Attention Controlgithubhttps://github.com/google/prompt-to-promptOrg:Google Research个人复现https://github.com/myhz0606/diffusion_learning个人博客主页http://myhz0606.com/article/p2p 1 前言 基于扩散模型&a…

基于python+vue食品安全信息管理系统flask-django-nodejs-php

食品安全信息管理系统设计的目的是为用户提供食品信息、科普专栏、食品检测、检测结果、交流论坛等方面的平台。 与PC端应用程序相比&#xff0c;食品安全信息管理系统的设计主要面向于用户&#xff0c;旨在为管理员和用户提供一个食品安全信息管理系统。用户可以通过APP及时查…

乐得瑞科技PD协议芯片:OTG与充电并行,引领数据交互

在科技日新月异的今天&#xff0c;数据交互的方式对于我们的日常生活和工作都起到了至关重要的作用。但在OTG技术诞生之前&#xff0c;这一过程却显得相当繁琐和耗时。想象一下&#xff0c;你需要将数码相机的照片导入到笔记本电脑中&#xff0c;却不得不频繁地拔出内存卡&…

流畅的 Python 第二版(GPT 重译)(一)

前言 计划是这样的&#xff1a;当有人使用你不理解的特性时&#xff0c;直接开枪打死他们。这比学习新东西要容易得多&#xff0c;不久之后&#xff0c;活下来的程序员只会用一个容易理解的、微小的 Python 0.9.6 子集来编写代码 。 Tim Peters&#xff0c;传奇的核心开发者&am…

vuex - 21年的笔记 - 后续更新

vuex是什么 Vuex是实现组件全局状态&#xff08;数据&#xff09;管理的一种机制&#xff0c;方便的实现组件之间的数据的共享 使用vuex统一管理状态的好处 能够在vuex中集中管理共享的数据&#xff0c;易于开发和后期维护能够高效地实现组件之间的数据共享&#xff0c;提高…

【Unity】层(Layer)详解

1.什么是Layer? 我们在做游戏开发的时候&#xff0c;尤其是场景比较复杂的时候&#xff0c;我们就需要使用Layer来分类。 比如&#xff1a; 排除不被灯光照亮的Layer 射线检测特定的 Layer 摄像机只能看到某些 Layer 对象之间的碰撞检测 Layer … 2.添加Layer ①在Inspecto…

C++ vector 删除

erase函数原型 iteratorerase(iterator position);//a.erase(p)&#xff0c;删除迭代器p所指向的元素,a为容器对象 iteratorerase(iterator first, iterator last);//a.erase(b,c)&#xff0c;删除迭代器b,c区间内的元素,a为容器对象 //返回值都是一个迭代器&#xff0c;该迭代…

Matlab 双目相机标定(内置函数)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 相机标定的目的就是要找到从世界坐标转换为图像坐标所用到的投影P矩阵各个系数(即相机的内参与外参)。具体过程如下所述: 1、首先我们需要获取一个已知图形的图像(这里我们使用MATLAB所提供的数据)。 2、找到同…

论文翻译 - Do-Not-Answer: A Dataset for Evaluating Safeguards in LLMs

论文链接&#xff1a;https://arxiv.org/pdf/2308.13387.pdf 项目代码&#xff1a;https://github.com/libr-ai/do-not-answer Do-Not-Answer A Dataset for Evaluating Safeguards in LLMs Abstract1 Introduction2 Related Work2.1 Studies in Specific Risk Areas2.2 Holist…

2024年03月CCF-GESP编程能力等级认证C++编程一级真题解析

本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 C++表达式 (3 - 2) * 3 + 5 的值是( )。 A. -13 B. 8 C. 2 D. 0 答案:B 第 2 题 C++语句 cout << “5%2=” <&l…

统计单词数

统计单词数 题目描述 一般的文本编辑器都有查找单词的功能&#xff0c;该功能可以快速定位特定单词在文章中的位置&#xff0c;有的还能统计出特定单词在文章中出现的次数。 现在&#xff0c;请你编程实现这一功能&#xff0c;具体要求是&#xff1a;给定一个单词&#xff0…

Reids面试问题以及答案

文章目录 1. 什么是 Redis&#xff1f;2. Redis 的优缺点3. Redis 与 Memcached 的优势比较4. Redis 支持的数据类型5. Redis 主要消耗的物理资源6. Redis 的数据淘汰策略7. Redis 官方为什么不提供 Windows 版本&#xff1f;8. 一个字符串类型的值能存储最大容量是多少&#x…

Java中Lambda表达式的学习

Lambda表达式的学习 什么是Lambda表达式假设有如下场景&#xff0c;对整数进行排序。Lambda表达式常常用于list的排序&#xff0c;过滤&#xff0c;转换&#xff0c;打印&#xff0c;分组 什么是Lambda表达式 Lambada表达式是JDK1.8时候增加的特性&#xff0c;Lambada实际上是…

比较大小(python)

本题要求将输入的任意3个整数从小到大输出。 输入格式: 输入在一行中给出3个整数&#xff0c;其间以空格分隔。 输出格式: 在一行中将3个整数从小到大输出&#xff0c;其间以“->”相连。 输入样例: 4 2 8输出样例: 2->4->8 nums list(map(int, input().split…

“找不到msvcr100.dll”或“msvcr100.dll丢失”的多种解决方法分享

当计算机系统中msvcr100.dll文件发生丢失时&#xff0c;导致某些应用程序无法正常运行。msvcr100.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows操作系统的应用程序正常运行至关重要。小编将介绍5种解决msvcr100.dll丢失问题的方法…

命令提示符——CMD基础操作介绍

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…