【学习笔记】【内核】container_of 的用法

根据结构体变量成员的指针获取整个结构体的指针

#include <stdio.h>                                                                                                                                                                                             2 #include "stdlib.h"
#include "string.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 person {char name[10];int age;int height;int weight;
};void show_person(struct person *per)
{printf("name = %s\n", per->name);printf("age = %d\n", per->age);printf("height = %d\n", per->height);printf("weight = %d\n", per->weight);
}int get_addr(char *name)
{struct person *per;printf("name = %p\n", name);per = container_of(name, struct person, name);printf("per = %p\n", per);show_person(per);return 0;
}int main()
{struct person *per = NULL;per = (struct person*)malloc(sizeof(struct person));printf("per = %p\n", per);strcpy(per->name, "wang");per->age = 18;per->height = 168;per->weight = 120;printf("test\n");get_addr(per->name);return 0;
}

container_of 可以根据结构体成员的地址找到整个结构体的地址,但是前提是结构体的空间要是连续的

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

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

相关文章

品牌如何营造生活感氛围?媒介盒子分享

「生活感」简而言之是指人们对生活的感受和意义&#xff0c;它往往没有充斥在各种重要的场合和事件中&#xff0c;而是更隐藏在细碎平凡的生活场景中。在营销越来越同质化的当下&#xff0c;品牌应该如何打破常规模式&#xff0c;洞察消费情绪&#xff0c;找到更能打动消费者心…

2023:AI疯狂进化年

嘿&#xff0c;大家好&#xff01;让我们一起来回顾一下这疯狂的 2023 年吧&#xff01;记得那个二月初吗&#xff1f;ChatGPT 上线了&#xff0c;然后呢&#xff1f;短短两个月&#xff0c;用户数量就像火箭一样突破了 1 亿&#xff01;这速度&#xff0c;简直比超级赛亚人还快…

前端JavaScript篇之对执行上下文的理解

目录 对执行上下文的理解创建执行上下文 对执行上下文的理解 当我们在执行JavaScript代码时&#xff0c;JavaScript引擎会创建并维护一个执行上下文栈来管理执行上下文。执行上下文有三种类型&#xff1a;全局执行上下文、函数执行上下文和eval函数执行上下文。 在写代码的时…

记录 | python importlib.import_module()用法

先入为主 背景 一个函数运行需要根据不同项目的配置&#xff0c;动态导入对应的配置文件运行。 解决 文件结构 a #文件夹│a.py│__init__.py b #文件夹│b.py│__init__.py├─c#文件夹│c.py│__init__.py# c.py 中内容 args {a:1}class C:def c(self):pass 目的 向a模…

(6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理

目录 一、为什么要使用Adaboost建模? 二、泰坦尼克号分析(工作环境) (插曲)Python可以引入任何图形及图形可视化工具 三、数据分析 四、模型建立 1、RandomForestRegressor预测年龄 2、LogisticRegression建模 引入GridSearchCV 引入RandomizedSearchCV 3、Deci…

【Network Management】谁来触发CanNm状态机跳转及CanNm如何知道主(被)动唤醒

目录 前言 正文 1.网络管理基本概念 2.CanNm和BswM模块交互 2.1 BswNMControl配置容器

第三百一十回

我们在上一章回中介绍了"再谈ListView中的分隔线"&#xff0c;本章回中将介绍showMenu的用法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在第一百六十三回中介绍了showMenu相关的内容&#xff0c;它主要用来显示移动PopupMenu在页面中的位置…

C++中的作用域

在C中&#xff0c;作用域是指程序中变量、函数和其他命名实体的可见性和可访问性范围。作用域规定了在代码中的哪些位置可以引用或使用特定的标识符。C中有多种类型的作用域&#xff0c;包括全局作用域、局部作用域和命名空间作用域。 全局作用域&#xff1a; 全局作用域是在整…

13.JS实现深拷贝的方式

实现方式1&#xff08;JSON.stringfy&#xff09; JSON.parse(JSON.stringify(obj))是目前比较常用的深拷贝方法之一&#xff0c;它的原理就是利用JSON.stringify 将js对象序列化&#xff08;JSON字符串&#xff09;&#xff0c;再使用JSON.parse来反序列化(还原)js对象。这个…

C语言第二十一弹---指针(五)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 转移表 1、转移表 总结 1、转移表 函数指针数组的用途&#xff1a;转移表 举例&#xff1a;计算器的⼀般实现&#xff1a; 假设我们需要做一个能够进行加减…

CoreSight学习笔记

文章目录 1 Components1.1 ROM Table 2 使用场景2.1 Debug Monitor中断2.1.1 参考资料 2.2 Programming the cross halt2.2.1 编程实现2.2.2 参考资料 2.3 CTI中断2.3.1 编程实现2.3.1.1 准备工作2.3.1.2 触发中断2.3.1.3 中断响应 2.3.2 参考资料 1 Components 1.1 ROM Table…

TCP和UDP相关问题(重点)(4)——4.使用TCP的协议有哪些?使用UDP的协议有哪些?

4.使用TCP的协议有哪些&#xff1f;使用UDP的协议有哪些&#xff1f; 使用TCP的协议有&#xff1a;HTTP3.0之前的HTTP协议、HTTPS、FTP、SMTP、SSH... 使用UDP的协议有&#xff1a;HTTP3.0、DNS、DHCP...

mybatis-plus使用apply进行字符串拆分后进行包含查询

首先数据库是 PostgreSql&#xff0c;有一个字段要进行模糊查询&#xff0c;我们一般是通过 like 就好了&#xff0c;但是偏偏这个字段是逗号分割的字符串&#xff0c;这个时候如果使用 like 也可以&#xff0c;只有字符串唯一&#xff0c;比如是 uuid 这类&#xff0c;但是啊&…

Java序列化详解

目录 一、什么是序列化 二、什么是反序列化 三、序列化和反序列化的作用 四、序列化和反序列化应用案例 五、常见序列化协议对比 5.1 JDK 自带的序列化方式 5.2 JDK序列化的缺陷 1. 无法跨语言 2. 易被攻击 3. 序列化后的流太大 4. 序列化性能太差 5.3 Kryo 5.4 Pr…

P8772 [蓝桥杯 2022 省 A] 求和--2024蓝桥杯冲刺省一

点击跳转例题 思路&#xff1a;简单数乘法结合律&#xff0c;然后前缀和的模板题&#xff1a; 前缀和的知识&#xff1a; 本题的代码&#xff1a;前缀和知识--模板&#xff1b; #include <bits/stdc.h> #define int long long //(有超时风险) #define PII pair<in…

rust语言tokio库底层原理解析

目录 1 rust版本及tokio版本说明1 tokio简介2 tokio::main2.1 tokio::main使用多线程模式2.2 tokio::main使用单线程模式 3 builder.build()函数3.1 build_threaded_runtime()函数新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图…

输入:123 输出321

给出一个 32 位的有符号整数&#xff0c;你需要将这个整数中每位上的数字进行反转。若翻转后超出取值范围&#xff0c;则输出0即可输入&#xff1a;123 输出321输入&#xff1a;-123 输出-321 #include <stdio.h> int main(int argc, char const *argv[]) { printf("…

StringBuilder与线程安全之StringBuffer

StringBuilder是Java中的一个类&#xff0c;位于java.lang包下&#xff0c;主要用于在程序中动态构建字符串。与String类相比&#xff0c;StringBuilder提供了一个可变的字符串序列&#xff0c;这意味着你可以在不生成新对象的情况下修改字符串的内容&#xff0c;从而提高了字符…

国产三维剖面仪—MPAS-100相控参量阵浅地层剖面仪

最近声学所东海站邹博士发来了他们最新的浅地层剖面仪—MPAS-100相控参量阵浅地层剖面仪的资料&#xff0c;市场型号GeoInsight&#xff0c;委托Ocean Physics Technology公司销售&#xff0c;地大李师兄的公司负责技术支持。 MPAS-100相控参量阵浅地层剖面仪就是俗称的三维浅…

git安装配置

1、下载安装 下载地址 2、配置git用户 git config --global user.name "yw" git config --global user.email "88888qq.com" 3、git init 初始化 4、生成ssh密钥 mkdir .ssh //创建文件夹cd .ssh //进入新建文件夹 ssh-keygen -t rsa // 输入密钥文…