C理解(三):结构体,共用体,枚举

news2024/11/25 16:56:54

结构体
结构体元素访问本质是指针方式,依据元素在结构体中的偏移量和元素类型进行访问
元素占字节数和类型占字节数不同,导致结构体的元素偏移量要复杂,因此结构体需要对齐访问

结构体对齐规则
结构体本身应在在4字节对齐处(占4个字节)
每个元素都对其存放
结构体对齐后的大小必须4的倍数

gcc对齐指令
#prgama pack(n)开头,#pragma pack()结尾,区间内n字节对齐,默认4字节对齐
attribute((packed)):packed取消对齐访问
attribute((aligned(n))):n字节对齐(整体结构体n字节对齐,即结构体占字节数)

offsetof宏
作用:计算结构体元素距离结构体首地址的偏移量
原理:虚拟type类型结构体,type.member访问元素,得到member相对首地址偏移量
原型:#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)
(TYPE *)0    
0强制类型转换TYPE指针类型(结构体变量可能不存在,解引用出错)。
((TYPE *)0)->MEMBER  
指针访问member元素
&(((TYPE *)0)->MEMBER)
获得member元素地址。由于整个结构体变量的首地址是0,所以元素地址大小为偏移量

container_of宏
作用:已知结构体元素指针,得到结构体变量的指针
原理:typeof得到member类型定义成一个指针,然后用这个指针减去该元素相对于整个结构体变量的偏移量(偏移量用offsetof宏得到的),减去之后得到的就是整个结构体变量的首地址了,再把这个地址强制类型转换为type *即可
原型:
#define container_of(ptr, type, member) ({      \
const typeof(((type *)0)->member) * __mptr = (ptr);  \
(type *)((char *)__mptr - offsetof(type, member)); })
ptr:数据结构成员指针
type:数据结构类型
member:  在数据结构中的成员

共用体
结构体成员是独立存在,分布在不同的内存单元中
共用体中成员不独立,共用内存单元
union大小为内存最大元素大小。
大小端模式:高字节对应高地址(大端模式),高字节对应低地址(小端模式 

枚举
默认值从0增加,若定义了值,则从定义值增加
宏定义和枚举的区别:枚举有关联符号封装,宏定义是离散的
枚举用于有限集合(一周7天,一月31天,一年12个月) 

demo1: 

        结构体对齐

        

#include <stdio.h>

struct info
{
        int a;
        char b;
        short c;
};

struct info1
{
        int a;
        char b;
        short c;
}__attribute__((aligned(1024)));

struct info2
{
        int a;
        char b;
        short c;
}__attribute__((packed));

int main()
{
        struct  info n; 
        printf("sizeof(n) = %d\n",sizeof(n));    
        struct info1 n1;
        printf("sizeof(n1) = %ld\n",sizeof(n1));    
        struct info2 n2;
        printf("sizeof(n2) = %d\n",sizeof(n2));    
        printf("&n == %p\n",&n);    
        printf("n.a == %p\n",&(n.a));
        return 0;  
}

结果示例: 

demo2:

        offsetof宏和container_of宏

#include <stdio.h>

#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)

#define container_of(ptr, type, member) ({                      \
const typeof(((type *)0)->member) * __mptr = (ptr);     \
(type *)((char *)__mptr - offsetof(type, member)); })

struct info
{
        int a;
        char b;
        short c;
};

int main()
{
        struct info n;
        n.a = 1;
        n.b = 'c';
        n.c = 3;
        printf("&n == %p\n",&n);         
        printf("&(n.a) == %p\n",&(n.a));
        printf("member c offset : %ld\n",offsetof(struct info,c));
        printf("struct info head address: %p\n",container_of(&(n.c),struct info,c));
        struct info *p = container_of(&(n.c),struct info,c);
        printf("%d\n%c\n%d\n",p->a,p->b,p->c);
        return 0;
}

结果示例:

demo3:

        测试大小端 

#include <stdio.h>

union info
{
        int a;
        char b;
};

int main()
{
        union info n;
        n.a = 1;
        printf("%d\n",(int)n.b);
        if((int)n.b == 1)
        {
                printf("small mode\n");
        }
        else
        {
                printf("big mode\n");
        }
}

结果示例:

demo4:

         枚举

#include <stdio.h>
enum judge
{
        FALSE,
        TRUE
};
        enum judge func()
{
        enum judge  num;
        num = TRUE;
        return num;
}

int main()
{
        enum judge num = func();
        if(num = FALSE)
        {
                printf("FALSE\n");
        }
        else if(num = TRUE)
        {
                printf("TURE\n");
        }
        else
        {
                printf("union have no member\n");
        }
        printf("%d\n",TRUE);    //1
        printf("%d\n",FALSE);  //0
}

结果示例:

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

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

相关文章

二、MAVEN的安装和配置

二、MAVEN的安装和配置 1.官网下载&#xff1a;http://maven.apache.org/download.cgi 2.解压文件包 1.apache-maven-3.5.2-bin.zip 直接解压到指定安装路径。 2.apache-maven-3.5.2-src.zip maven源码包。 3.配置环境变量&#xff0c;类似jdk环境配置 1.创建M2_HOME环境变…

关于操作系统与内核科普

关于操作系统与内核科普 一.什么是操作系统 操作系统是管理计算机硬件与软件资源的计算机程序。它为计算机硬件和软件提供了一种中间层。 操作系统是一种软件&#xff0c;主要目的有三种&#xff1a; 一.管理计算机资源&#xff0c;这些资源包括CPU&#xff0c;内存&#xff0…

正在等待操作系统重新启动。 请重新启动计算机以安装autocad 2024。

正在等待操作系统重新启动。 请重新启动计算机以安装autocad 2024。 这是刚启动Autodesk 2024产品就弹出的弹窗&#xff0c;重启之后启动还是有这个 一直阻止安装程序运行 出现问题的原因是安装包存在问题 使用正确的安装包即可解决这个问题 需要的朋友查看图片或者评伦取…

【剑指Offer】7.重建二叉树

题目 给定节点数为 n 的二叉树的前序遍历和中序遍历结果&#xff0c;请重建出该二叉树并返回它的头结点。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建出如下图所示。 提示: 1.vin.length pre.length 2.pre 和 vin 均无重复…

《Python趣味工具》——ppt的操作(2)

在上次&#xff0c;我们对PPT进行了简单的处理&#xff1b;本次&#xff0c;我们要将PPT中的文本内容写入到 Word 文档中并添加标题&#xff0c;让 Word 文档看上去结构清晰&#xff0c;方便使用。 文章目录 一、安装docx模块&#xff1a;二、从PPT中转移文字&#xff1a;1. 创…

Elasticsearch基础篇(二):Elasticsearch在windows和liunx上的安装部署

Elasticsearch简介 前言1. Windows环境部署Elasticsearch1.1 下载并解压Elasticsearch压缩包1.2 命令行启动elasticsearch1.3 验证是否成功启动elasticsearch1.4 关闭Elasticsearch1.5 在Windows上安装Elasticsearch作为服务 2. Liunx环境部署Elasticsearch安装 Elasticsearch …

Python 爬虫 / web 面试常见问题

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0c;直接在文末名片自取就可 爬虫面试常见…

Excel技巧之【锁定工作簿】

Excel工作簿是Excel工作区中一个或多个工作表的集合&#xff0c;我们知道Excel可以设置锁定工作表&#xff0c;防止意外或被他人修改&#xff0c;但可能有小伙伴不知道&#xff0c;Excel工作簿也同样可以设置锁定&#xff0c;防止更改。 那工作簿锁定后会怎么样呢&#xff1f;…

Mysql——三、SQL语句(上篇)

Mysql 一、SQL语句基础1、SQL简介2、SQL语句分类3、SQL语句的书写规范 二、数据库操作三、MySQL 字符集1、变量2、utf8和utf8mb4的区别 四、数据库对象五、SELECT语句1、简单的SELECT语句2、SQL函数2.1 聚合函数2.2 数值型函数2.3 字符串函数2.4 日期和时间函数2.5 流程控制函数…

Spring结合自定义注解实现 AOP 切面功能

Spring结合自定义注解实现 AOP 切面功能 Spring AOP 注解概述Aspect 快速入门execution 切点表达式 拦截指定类的方法Pointcut("annotation(xx)") 拦截拥有指定注解的方法环绕通知 实现开关目标方法案例1&#xff1a;自定义注解切面实现统一日志处理1.自定义日志注解…

Python3中类的高级语法及实战

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 一: 类定义语法 通过下面的实例,你将会了解到如下的内容体系&#xff1a; (1)类静态属性 (2)类动态属性 (3)类初始化过程: __init__(self)被执行&am…

java对象半初始化问题是怎么回事

文章目录 一、前言1. 什么是Java对象半初始化2. 对象半初始化问题引发的影响 二、对象半初始化问题详解1. Java对象创建过程 2. 对象半初始化问题产生的原因三、实例分析&#xff1a;对象半初始化问题的表现1. 单线程环境下的半初始化2. 多线程环境下的半初始化 四、解决方案及…

Java 基于 SpringBoot 的校园疫情防控系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2.主要技术3 需求分析4系统设计4.1功能结构4.2 数据库设计4.2.1 数据库E/R图4.2.2 数据库表…

预编译(1)

目录 预定义符号&#xff1a; 使用&#xff1a; 结果&#xff1a; 预编译前后对比&#xff1a; #define定义常量&#xff1a; 基本语法&#xff1a; 举例1&#xff1a; 结果&#xff1a; 预编译前后对比&#xff1a; 举例2&#xff1a; 预编译前后对比&#xff1a; 注…

嵌入式软硬件

在这里插入图片描述

APP渗透测试

APP反抓包突破 抓包失败分析 工具证书未配置 app不使用HTTP/S协议 反模拟器 1.使用真机进行抓包 2.用模拟器模拟真机 3.逆向删除反模拟器代码打包重新测试 反证书 SSL证书绑定分为单向校验和双向校验&#xff0c;单向校验就是客户端校验服务端的证书&#xff0c;双向…

回调函数的用途

一、函数指针 在讲回调函数之前&#xff0c;我们需要了解函数指针。 我们都知道&#xff0c;C语言的灵魂是指针&#xff0c;我们经常使用整型指针&#xff0c;字符串指针&#xff0c;结构体指针等 int *p1; char *p2; STRUCT *p3; //STRUCT为我们定义的结构体但是好像我们一…

【CTFHUB】SSRF绕过方法之靶场实践(二)

SSRF POST请求 提示信息&#xff1a; 这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年 首先测试了http的服务请求&#xff0c;出现对话框 输入数值后提示&#xff1a;只能接受来自127.0.0.1的请求 右键查看源码发现key值 通过file协…

k8s+kubeedge+sedna安装的全套流程

一&#xff0c;环境准备 把两台虚拟机的ip地址设置成静态的IP地址&#xff0c;否则ip地址会变 虚拟机配置静态IP&#xff08;NAT模式&#xff09;_nat子网的准入_阿祖&#xff0c;收手吧的博客-CSDN博客​​​​​​ 节点IP软件 云节点192.168.133.139kubernetescloudcore边…

与初至波相关的常见误解

摘要: 初至波是指检波器首次接收到的波. 对它的误解会使我们失去重要的信息. 1. 波从震源到检波器的传导过程 从震源产生波以后, 有些波通过地面直接传导到检波器, 这些称为直达波 (面波);有些在地层中传播,遇到两种地层的分界面时 产生波的反射,在原来地层中形成一种新波, …