当前位置:网站首页>C语言中变量在内存中的保存与访问
C语言中变量在内存中的保存与访问
2022-08-02 20:08:00 【Code Writers】
CPU通过内存地址访问元素
int i=0x12345678
假如i的地址是0x100,那么在小端存储体系中
地址 数值
0x100 0x78
0x101 0x56
0x102 0x34
0x103 0x12
CPU访问内存需要同时具备两个因素:
内存基址:从哪里访问内存——就是地址
内存布局:访问几个字节(怎样解析,解释方法)
定义变量时指明的数据类型就是指明内存布局,i是int型变量,所以CPU知道连同0x100后面四个地址一起组成i的值
强制类型转换改变的就是解析方法,也就是内存布局
char p= (char)i
这样CPU会只将地址0x100中的0x78解析为一个char类型的字符然后赋给p
同理 short p=(short)i
得到的short型变量p的值是0x5678
这样看来,只要给定了内存基址和内存布局就可以不用实际变量名得到变量值
比如 *(short *)0x102实际上就是值0x1234
对于结构体变量来说也是如此解析的(虽然其中有内存对齐问题)
struct foo{
int first;
short second;
char third;
}*pfoo;
对于语句 pfoo->first中的->操作符,它首先算出右侧的变量在左侧结构体中的偏移量,然后让左侧变量的地址(指针所指地址)加上偏移量就实际上得到了右侧变量的内存基址,然后根据右侧变量类型,也就是得到了它的内存布局,这样两个因素都具备了也就得到了它的值
在一些实际应用中,会看到这样的链表应用方法:将链表嵌入到数据结构中(学校里用的链表大概都是将数据结构嵌入链表)
struct data_in_list{ //数据嵌入双向链表
int price;
… //一些可能要用的数据
struct data_in_list *next;
struct data_in_list *pre;
}
//下面是链表嵌入数据结构中
struct list{
struct list *next;
struct list *pre;
}
struct list_in_data{
…//一些会用到的数据
struct list lnode;
}
比如在2.6版本的Linux内核中,这种数据结构是很常见的,进程描述符task_struct结构体中就包含链表节点,所有进程描述符是用一个双向链表连起来的,而根据链表节点访问结构体就是用到了上面说的CPU访问数据的两个要素
type 是结构体类型
address 是结构体中链表节点
field 是链表节点类型
(type*)(address - &(((type*)0)->field)) //(type*)0表示内存基址是0的type型变量,&符获得了field在type中的偏移量
//这样可以根据链表节点得到其所在的type结构体的地址,实际上可以根据结构体中任一变量得到整个结
边栏推荐
- Golang source code analysis: time/rate
- 【 LeetCode 】 1374. Generate each character string is an odd number
- 网上那么多教人赚钱的方法,但是你实际上是靠什么赚钱的呢?
- 如何使用windbg查看C#某个线程的栈大小 ?
- Linphone 被叫方如何解析来电SIP消息中的自定义头消息
- Digital twins help visualize the construction of smart cities
- 二丙二醇甲醚醋酸酯
- LeetCode - 105. 从前序与中序遍历序列构造二叉树;023.合并K个升序链表
- PG's SQL execution plan
- 笑话:如果你在河边等待得足够久,你会看到你的敌人的尸体漂过,是怎么翻译出来的?
猜你喜欢
Leetcode刷题——字符串相加相关题目(415. 字符串相加、面试题 02.05. 链表求和、2. 两数相加)
基于 outline 实现头像剪裁以及预览
「 每日一练,快乐水题 」1374. 生成每种字符都是奇数个的字符串
浅议.NET遗留应用改造
Shell: conditional statements
Informatics Olympiad All-in-One (1259: [Example 9.3] Find the longest non-descending sequence)
供电系统电气图
TodoList案例
ssdp协议搜索GB28181设备
牛客题目——滑动窗口的最大值、矩阵最长递增路径、顺时针旋转矩阵、接雨水问题
随机推荐
ImageNet下载及处理
Day35 LeetCode
信息系统项目管理师必背核心考点(五十八)变更管理的主要角色
你所不知道的C#中的细节
Tencent YunMeng every jie: I experienced by cloud native authors efficiency best practices case
SQL 入门之第一讲——MySQL 8.0.29安装教程(windows 64位)
五大维度解读软件测试分类
Thread线程类基本使用(下)
golang 源码分析:juju/ratelimit
golang源码分析:time/rate
实现fashion_minst服装图像分类
成为黑客不得不学的语言,看完觉得你们还可吗?
unittest自动化测试框架总结
Triacetin是什么化学材料
磁盘分区的知识
In action: 10 ways to implement delayed tasks, with code!
LeetCode:622. 设计循环队列【模拟循环队列】
训练双塔检索模型,可以不用query-doc样本了?明星机构联合发文
Helm基础知识
Lvm逻辑卷