C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)
和黛玉学编程呀,大家一起努力呀.............
结构体类型的声明
回顾一下
struct tag
{
member-list;
}variable-list;
创建和初始化
我们知道,在C语言中,对于一些数据是必须初始化的,但是结构体怎么创建并且初始化呢?很简单,直接赋值上就好了
#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后面不写东西,比如上面的把Stu去掉
结构体的自引用
递归里面我们知道它用到了自己,那结构体可以包含一个类型为该结构本身的成员吗?
来看一下吧
struct Node
{int data;struct Node* next;
};
结构体的内存对齐
对齐规则:
1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处
2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处对⻬数=编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。(VS 中默认的值为 8
Linux中gcc没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩)3.结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍
看那么多不如找代码来练习一下就知道啦
1.
struct S1
{
char c1;
int i;
char c2;
};
printf("%d\n", sizeof(struct S1));
在vs上默认值是8
对于C1,从0开始,然后对于i,它对齐数是4 对⻬数=编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。
然后就从4开始对齐,他是int类型,占4个字节,占到7,
对于C2,对齐数是1,占到8,这个时候大小为9,从0到8也就是9个格子啦,这是可能会判断错的,所以最好画图解决
但是由于对齐规则(结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的整数倍。),在这个结构体最大对齐数为4,整数倍并且比9大的也就是12啦
如果我把结构体里面的内容换一个位置呢,结果又会怎么样呢?
看代码:
struct S2
{
char c1;
char c2;
int i;
};
printf("%d\n", sizeof(struct S2));
我们再画图,c1从0 开始,c2的对齐数是1,从开始的一个字节,然后i的对齐数是4,从4开始4个字节,到7为止,现在大小是8,刚好是最大对齐数的整数倍,所以答案就是8


为什么要内存对齐呢
首先: 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常
然后:数据结构(尤其是栈)应该尽可能地在⾃然边界上对⻬。原因在于,为了访问未对⻬的内存,处理器需要作两次内存访问;
总之有那么一个说法,结构体对齐就是拿空间换取时间的做法
在设计结构体的时候,我们为了节省空间又满足对齐规则,所以尽量把占空间小的成员集中在一起,上面的两个例子已经可以说明啦
修改默认对齐数
上面说到,在vs上默认对齐数是8,但是我不想对齐数是8应该怎么修改呢,#pragma 这个预处理指令,可以改变编译器的默认对⻬数。
#include <stdio.h>
#pragma pack(1) //设置默认对⻬数为1
struct S
{
char c1;
int i;
char c2;
};
#pragma pack() //取消设置的对⻬数,还原为默认
int main()
{
printf("%d\n", sizeof(struct S));
return 0;
}
注意:结构体传参的时候,最好传的是地址,也就是需要使用到指针
结构体实现位段
什么是位段
1. 位段的成员必须是 int、unsigned int 或signed int ,在C99中位段成员的类型也可以
选择其他类型。
2. 位段的成员名后边有⼀个冒号和⼀个数字。
这个位段是为了节省空间
struct A
{
int _a:2;
int _b:5;
int _c:10;
int _d:30;
};
这个时候A就是一个位段类型

这个2,5,10,34是比特的意思,加起来是47比特, 然后8是两个整型,可以放下47比特
位段的内存分配?
1. 位段的成员可以是 int unsigned int signed int 或者是 char 等类型?
2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的⽅式来开辟的。
3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使⽤位段。
跟结构相⽐,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在
位段使⽤的注意事项:
位段的⼏个成员共有同⼀个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位
置处是没有地址的。内存中每个字节分配⼀个地址,⼀个字节内部的bit位是没有地址的。?
所以不能对位段的成员使⽤&操作符,这样就不能使⽤scanf直接给位段的成员输⼊值,只能是先输⼊
放在⼀个变量中,然后赋值给位段的成员。
然后就到这里啦,你能看到这里,你已经很厉害啦,希望这些知识对你有所帮助啦,干完C语言然后我们就需要学习数据结构啦,这篇也算是数据结构里面的内容哦
相关文章:
C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)
和黛玉学编程呀,大家一起努力呀............. 结构体类型的声明 回顾一下 struct tag { member-list; }variable-list; 创建和初始化 我们知道,在C语言中,对于一些数据是必须初始化的,但是结构体怎么创建并且初始化呢࿱…...
springboot240基于Spring boot的名城小区物业管理系统
基于Spring boot的名城小区物业管理系统的设计与实现 摘要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。以前相关行业对于物业信息的管理和控制,采用人工登记的方式保存相关数…...
Day13:信息打点-JS架构框架识别泄漏提取API接口枚举FUZZ爬虫插件项目
目录 JS前端架构-识别&分析 JS前端架构-开发框架分析 前端架构-半自动Burp分析 前端架构-自动化项目分析 思维导图 章节知识点 Web:语言/CMS/中间件/数据库/系统/WAF等 系统:操作系统/端口服务/网络环境/防火墙等 应用:APP对象/API接…...
AJAX 学习笔记(Day1)
「写在前面」 本文为黑马程序员 AJAX 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。 目录 0 课程介绍 1 AJAX 入门 1.1 AJAX 概念和 axios 使用 1.2 认识 URL 1.3 URL 查询参数 1.4 常用请求方法和数据提交 1.5 HT…...
leetcode 740.删除并活得点数
这道题和打家劫舍得思路很像。 思路:首先我们看到题目的意思,就是说我们如果选择了一个数,那么它相邻的数就会不得选入,也就是删除。这就是上一个题那个相邻的家不能偷的问题呗! 我们从那个地方转换一下,…...
寻找峰值[中等]
优质博文IT-BLOG-CN 一、题目 峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设nums[-1] nums[n] -∞。 你…...
【ESP32 IDF】key按键与EXTI中断
文章目录 前言一、按键的使用1.1 按键的简介1.2 读取按键的高低电平1.3 读取按键具体代码 二、中断二、EXIT外部中断2.1 EXIT外部中断简介2.2 外部中断基础知识2.3 设置外部中断注册外部中断服务函数设置触发方式添加中断函数 2.4 示例代码 总结 前言 在嵌入式系统开发中&…...
Find My运动相机|苹果Find My技术与相机结合,智能防丢,全球定位
运动相机设计用于在各种运动和极限环境中使用,如徒步、登山、攀岩、骑行、滑翔、滑雪、游泳和潜水等,它们通常具有防抖防震、深度防水和高清画质的特点,能够适应颠簸剧烈的环境,甚至可以承受一定程度的摔落,一些运动相…...
零拷贝技术深入分析
一、零拷贝 在前面的文章“深浅拷贝、COW及零拷贝”中对零拷贝进行过分析,但没有举例子,也没有深入进行展开分析。本文将结合实际的例程对零拷贝进行更深入的分析和说明。 在传统的IO操作中,以文件通过网络传输为例 ,一般会经历以…...
Android 基础入门 基础简介
1. 观察App运行日志 2.Android 开发设计的编程语言 koltin Java c c 3.工程目录结构 4.Gradle 5.build.gradle 文件解析 plugins {id("com.android.application")//用了哪些插件 主配置文件版本控制 所以这里不用写版本 }android {namespace "com.tiger.myap…...
HUAWEI 华为交换机 配置基于VLAN的MAC地址学习限制接入用户数量 配置示例
组网需求 如 图 2-15 所示,用户网络 1 通过 LSW1 与 Switch 相连, Switch 的接口为 GE0/0/1 。用户网络2通过 LSW2 与 Switch 相连, Switch 的接口为 GE0/0/2 。 GE0/0/1 、 GE0/0/2 同属于 VLAN2。为控制接入用户数,对 VLAN2 进…...
编程笔记 Golang基础 042 文件处理
编程笔记 Golang基础 042 文件处理 一、文件处理二、Go语言文件处理创建文件和写入内容打开文件并按模式读写读取文件内容更高级的文件和IO操作改变文件权限目录操作 小结 一、文件处理 文件处理是指在计算机科学中,对存储在磁盘或其他持久性存储介质上的文件进行的…...
linuxlsof详解
lsof 是 List Open File 的缩写, 它主要用来获取被进程打开文件的信息,我们都知道,在Linux中,一切皆文件,lsof命令可以查看所有已经打开了的文件,比如: 普通文件,目录,特殊的块文件,…...
学习JAVA的第十二天(基础)
目录 算法 查找算法 基本查找(顺序查找) 二分查找(折半查找) 分块查找 排序算法 冒泡排序 选择排序 插入排序 快速排序 递归算法 算法 算法(Algorithm)是指解题方案的准确而完整的描述ÿ…...
Vector集合源码分析
Vector集合源码分析 文章目录 Vector集合源码分析一、字段分析二、方法分析三、总结 内容如有错误或者其他需要注意的知识点,欢迎指正或者探讨补充,共同进步。 一、字段分析 //用于存储该集合中的所有数据对象,所以是基于数组实现的 protec…...
Unity引擎中光源都有哪几种,都有什么作用
本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com Unity 引擎为了实现游戏场景的明暗和光影效果,提供了四种类型的光源,分别是方向光(Directional Lights)、点光源(Point Lights)、聚光灯…...
C语言中结构体成员访问操作符的含义及其用法
1.直接访问操作符 用法:结构体名.成员名。 含义:直接访问结构体中的成员变量。 示例: #include<stdio.h> struct student {char name[20];int age; }; int main() {//定义了一个结构体数组arrstruct student arr[4] { {"cxk&q…...
Kubeadmin方式部署Calico网络模式的K8s集群
目录 1.环境准备 2.配置内核参数 3.配置ntp时间服务器 4.配置持久化日志目录 5.升级物理机内核 6.配置ipvs服务 7.安装docker 8.安装kubeadm、kubectl、kubelet 9.导入k8s组件基础镜像 10.k8s初始化配置 11.配置calico网络 12.完成部署 1.环境准备 ###方案中涉及的…...
sparse transformer 常见稀疏注意力
参考: https://zhuanlan.zhihu.com/p/259591644 主要就是降低transformer自注意力模块的复杂度 复杂度主要就是 Q K^T影响的,稀疏注意力就是在Q点乘K的转置这模块做文章 下列式一些sparse transformer稀疏注意力方法 a、transformer原始的 ࿰…...
力扣 第 125 场双周赛 解题报告 | 珂学家 | 树形DP + 组合数学
前言 整体评价 T4感觉有简单的方法,无奈树形DP一条路上走到黑了,这场还是有难度的。 T1. 超过阈值的最少操作数 I 思路: 模拟 class Solution {public int minOperations(int[] nums, int k) {return (int)Arrays.stream(nums).filter(x -> x <…...
OpenClaw安全防护指南:Qwen2.5-VL-7B图文模型权限管理
OpenClaw安全防护指南:Qwen2.5-VL-7B图文模型权限管理 1. 为什么需要关注OpenClaw的安全防护? 上周我在调试一个自动整理照片的OpenClaw任务时,突然发现脚本试图删除我整个Documents文件夹——仅仅因为我随口说了句"把没用的文件清理掉…...
AUTOSAR SoAd配置避坑指南:TCP/UDP模式、自动启动与Fanout发送的那些‘坑’
AUTOSAR SoAd实战避坑手册:从TCP连接异常到Fanout发送失效的深度解析 车载以太网通信作为智能汽车的中枢神经系统,其稳定性直接关系到整车功能的可靠性。在AUTOSAR架构中,SoAd模块作为TCP/IP协议栈与上层应用之间的桥梁,其配置复杂…...
【声音克隆】Qwen3-TTS-12Hz-1.7B-Base零基础部署教程:5分钟搞定10国语言语音合成
Qwen3-TTS-12Hz-1.7B-Base零基础部署教程:5分钟搞定10国语言语音合成 声音克隆技术迎来重大突破!Qwen3-TTS-12Hz-1.7B-Base作为新一代语音合成模型,支持中文、英文、日文等10种主要语言和多种方言风格。本文将带你从零开始,只需5…...
OpenClaw调用Qwen3-32B镜像成本实测:RTX4090D长任务Token消耗分析
OpenClaw调用Qwen3-32B镜像成本实测:RTX4090D长任务Token消耗分析 1. 为什么关注OpenClaw的Token消耗问题 第一次用OpenClaw完成文件整理任务时,我被账单吓了一跳——短短10分钟的操作消耗了近3万Token。这让我意识到:自动化助手的长期使用…...
Qwen3-TTS-Tokenizer-12Hz生产环境应用:高并发音频编解码服务架构
Qwen3-TTS-Tokenizer-12Hz生产环境应用:高并发音频编解码服务架构 1. 引言:音频编解码的技术挑战与解决方案 在现代语音应用中,音频数据的处理和传输一直是个头疼的问题。你想啊,一段普通的语音文件,动辄就是几MB甚至…...
如何快速掌握 Dism++:Windows 系统优化的终极多语言解决方案
如何快速掌握 Dism:Windows 系统优化的终极多语言解决方案 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language Dism 是一款强大的 Windows 系统优化工具…...
【独家首发】.NET 9 AOT编译边缘优化白皮书:静态链接、无GC堆、零依赖二进制生成全流程
第一章:.NET 9 AOT编译边缘优化全景概览.NET 9 将 AOT(Ahead-of-Time)编译能力推向生产级边缘场景,显著降低冷启动延迟、内存占用与部署包体积,尤其适用于 IoT 设备、Serverless 函数、嵌入式容器及轻量 WebAssembly 应…...
【论文解读】SparseDriveV2: Scoring is All You Needfor End-to-End Autonomous Driving
https://github.com/swc-17/SparseDriveV2 【摘要】 【引言】 【相关工作】 【方法】 【实验】...
LPC11U24单总线DHT22/RHT03轻量驱动实现
1. RHT03传感器驱动库深度解析:面向LPC11U24平台的轻量级DHT22/RHT03固件实现1.1 项目背景与工程定位RHT03是DHT22温湿度传感器的兼容型号,采用单总线数字通信协议,具备0.5℃温度精度与2%RH湿度精度,工作电压范围3.3–5.5V&#x…...
Aseprite新手必看:5分钟搞定像素角色基础动画(附完整工程文件)
Aseprite像素动画速成指南:从静态角色到生动动作的5分钟魔法 第一次打开Aseprite时,我被它简洁的界面和强大的功能震撼了——作为一个独立游戏开发者,我需要快速制作角色动画,但又不想陷入复杂的美术流程。经过多次实践ÿ…...
