C语言内幕--全局变量(结合内存分区、汇编视角看类型、连接器)

news2024/11/23 21:20:22

前言

  • 学习资源:b站up主:底层技术栈
  • 学过C语言都知道,全局变量可以再全局中使用,其实全局变量内部还是涉及到不少知识,这里从内存分区、汇编视角看类型、连接器等角度看待全局变量;
  • 由于涉及到底层技术,如果有错误,请各位大佬指点

🌩 以以下代码为例

#include <stdio.h>

// 定义全局变量
int a = 123;
int* p = &a;

int main()
{
	printf("a: %d, p: %x\n", a, p);
	return 0;
}

📅 全局数据

在C语言中属于全局数据的有三个:

  1. 函数都是全局的
  2. 字符串常量
  3. 全局的变量

注意: 全局数据不等于全局变量!!!

案例中:

  • 变量a、p都属于全局变量

📝 C语言内存分区

我们之前学过内存四区:栈区、堆区、全局区、代码区(从高地址向低地址),在C语言中,如果细分,可以将全局区分为:常量区与全局(静态)区,如图所示。

在这里插入图片描述

注意:堆区内存不连续,地址向下增长,栈区内存连续,地址向下增长。

案例中:

  • 变量a、p都存储在全局区(.data)区,拥有读写权限

🤗 汇编视角看类型

在汇编语言中,只有指令,没有类型这一概念,类型是高级语言抽象出来的,目的是为了调用不同的指令,特殊的指令被高级语言抽象出来了汇编,如:

		 int a >> 4,这里是有符号,故属于算术右移,有符号,高位填符号位,** 汇编 调用asr指令**
unsigned int a >> 4,这里是无符号,故属于逻辑右移,高位填0** 汇编 调用shr指令**

🔗 连接器

连接器作用: 连接代码所需要的API的二进制代码,比如printf。从内存来看,连接器对整个(最终的可执行文件)程序的“内存布局”规划好后,全局变量都是常量 并且在main函数调用前就被初始化好了,本人认为这也是为什么全局变量自动初始化为0的原因了。

🤔 联系栈区

栈区存储局部变量,局部变量在没有初始化前,他的值是任意的,那是因为对于栈区的变量来说,都是程序执行到那个阶段才会给那个变量分配内存联想函数,这也就是意味着在函数中局部变量的内存只有在调用函数的时候才会给他的变量分配内存,这样就解释了为什么输出一个未初始化的局部变量是乱码,而且每一次都不一样的原因了,函数存储在代码区,这也是程序分区,实现了程序更好的管理。

例子

// 全局变量
struct temp { 
        void (*add)(int, int);  // 8字节
        void (*dev)(int, int);  // 8字节
};

这是一个结构体,里卖定义了两个函数指针,这个结构体和这两个指针,在连接器对程序的整个“内存布局”都规划好后,都是常量了,并且如果没有在全局变量中赋值,则默认都赋值为0。

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

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

相关文章

新160个crackme - 089-fornixcrackme1

运行分析 需要破解Name和Serial PE分析 ASM程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida搜索找到关键字符串 动态分析关键函数&#xff0c;逻辑如上图&#xff0c;通过Name计算得到char_1&#xff0c;亦或后对比Serial&#xff0c;相等则返回成功信息 分析…

Python爬虫系列(一)

目录 一、urllib 1.1 初体验 1.2 使用urllib下载网页、图片、视频等 1.3 反爬介绍 1.4 请求对象定制 1.5 get请求的quote方法 1.6 多个参数转成ascii编码 1.7 post请求 1.8 综合案例演示 一、urllib 1.1 初体验 # urllib是python默认带的&#xff0c;无需额外下载 i…

动态规划-回文串问题——5.最长回文子串

1.题目解析 题目来源&#xff1a;5.最长回文子串——力扣 测试用例 2.算法原理 1.状态表示 判断回文子串需要知道该回文子串的首尾下标&#xff0c;所以需要一个二维数组且数据类型为bool类型来存储每个子字符串是否为回文子串&#xff0c; 即dp[i][j]:以第i个位置为起始&a…

源代码安全管理:深信达SDC沙盒技术解密

在数字化时代&#xff0c;源代码安全管理的重要性日益凸显&#xff0c;它不仅关系到企业的核心竞争力&#xff0c;更是企业智慧成果的结晶。深信达的SDC沙盒防泄密软件以其独特的技术优势&#xff0c;为源代码安全提供了全方位的保护。 源代码安全管理的重要性 源代码作为企业…

Virtuoso使用layout绘制版图、使用Calibre验证DRC、LVS、PEX抽取RC

1 绘制版图 1.1 进入Layout XL 绘制好Schmatic后&#xff0c;在原理图界面点击Launch&#xff0c;点击Layout XL进入版图绘制界面。 1.2 导入元件 1、在Layout XL界面左下角找到Generate All from Source。 2、在Generate Layout界面&#xff0c;选中“Instance”&#…

YOLO11改进 | Neck | 有效提升小目标检测效果,附完整代码结构图【论文必备】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文给大家带来的教程是将YOLO11的卷积替…

vue文件转AST,并恢复成vue文件(适用于antdv版本升级)

vue文件转AST&#xff0c;并恢复成vue文件---antdvV3升级V4 vue文件转AST&#xff0c;重新转回原文件过程如何获取项目路径读取项目文件&#xff0c;判断文件类型分别获取vue文件 template js&#xff08;vue2和vue3&#xff09;处理vue 文件template部分处理vue script部分uti…

【染色时间】

题目 代码 #include <bits/stdc.h> using namespace std; #define x first #define y second typedef pair<int,int> PII; const int N 510; int dx[] {0,0,-1,1}, dy[] {-1,1,0,0}; int d[N][N], w[N][N]; int n, m; void bfs() {memset(d, 0x3f, sizeof d);q…

蓝牙 BLE 详解

参考链接 BLE博客书籍推荐&#xff1a;Intro to Bluetooth Low Energy: The easiest way to learn BLE

QT项目-仿QQ聊天(带宠物系统)

目录 一&#xff0c;项目介绍 二&#xff0c;开发环境 三&#xff0c;涉及技术 四&#xff0c;项目效果示例图 1&#xff0c;登录界面 2&#xff0c;主界面 3&#xff0c;聊天界面 4&#xff0c;功能界面 5&#xff0c;宠物界面 一&#xff0c;项目介绍 这是一个基于u…

【Linux内核大揭秘】程序地址空间

文章目录 什么是程序地址空间地址空间的组成虚拟内存技术 如何理解程序地址空间页表页表的细节关于堆区 在Linux中如何查看各个分段的信息总结 什么是程序地址空间 程序地址空间是一个程序在执行期间可以访问的内存范围。它由操作系统为每个进程分配&#xff0c;以确保进程之间…

资深项目经理推荐的这五款国产项目管理软件值得收藏使用

随着国产项目管理软件的发展&#xff0c;国内也涌现了一批优秀的项目管理软件&#xff0c;他们在各个领域都非常出色&#xff0c;国产项目管理软件在安全性和网络访问上是国外产品无法比拟的&#xff0c;像进度猫、建文、新页等&#xff0c;以下推荐五款国产项目管理软件&#…

[POI2014] PTA-Little Bird(单调队列优化 DP)

luogu 传送门https://www.luogu.com.cn/problem/P3572 解题思路 先设 表示到 的最小劳累值。 很容易得出转移&#xff1a; 其中 由 和 的大小关系决定&#xff0c;并且 。 很显然&#xff0c;直接暴力是 的&#xff0c;会超时。 于是&#xff0c;考虑优化。 我们发现…

python--函数详解二

一、作用域&#xff1a; 一个标识符的可见范围&#xff0c;这就是标识符的作用域&#xff0c;一般说的是变量的作用域 1.1、全局作用域 运行结果 在整个程序运行环境中可见。可以被多个函数重复多次使用 1.2、局部作用域 运行结果 这里调用a&#xff0c;显示未定义&#xff…

LeetCode 3165. 不包含相邻元素的子序列的最大和

. - 力扣&#xff08;LeetCode&#xff09; 题目 给你一个整数数组 nums 和一个二维数组 queries&#xff08;维&#xff09;&#xff0c;其中 queries[i] []。 对于每个查询 i&#xff0c;首先将 nums[] 设置为 &#xff0c;然后计算查询 i 的答案&#xff0c;该答案为 nu…

基于无框力矩电机抱闸实现人形机器人在展会中不依赖悬吊

目录&#xff1a; 1 人形机器人在展会中的悬吊状态 2 人形机器人不能长时间站立的原因 3 基于电机抱闸使人形机器长时间站立 4 人形机器人在实用场景中必须长时间站立、快速进行 “静-动” 互换 5 人形机器人在实用场景中实现 “静-动” 快速互换的抱闸控制思路 6 无框力…

Rust 力扣 - 2090. 半径为 k 的子数组平均值

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 半径为 k 的子数组平均值 等价于 子数组长度为2 * k 1的总和 除于 2 * k 1 我们遍历长度为2 * k 1的窗口&#xff0c;我们只需要记录窗口内的平均值即可 题解代码 impl Solution {pub fn get_averages(num…

哪些远程控制软件能高清畅玩黑神话?

远程控制软件近年来越来越普及&#xff0c;这类软件使用场景广泛&#xff0c;包括远程办公、技术支持、教育等。但其实除了协助远程办公之外&#xff0c;对于游戏玩家来说&#xff0c;远程操控软件还是一款能够让他们即使身处异地也能享受到流畅的游戏体验的好工具。利用远程控…

qt QComboBox详解

QComboBox是一个下拉选择框控件&#xff0c;用于从多个选项中选择一个。通过掌握QComboBox 的用法&#xff0c;你将能够在 Qt 项目中轻松添加和管理组合框组件&#xff0c;实现复杂的数据选择和交互功能。 重要方法 addItem(const QString &text)&#xff1a;将一个项目添…

架构师备考-数据库基础

基本概念 数据&#xff08;Data&#xff09;&#xff1a;是描述事物的符号记录&#xff0c;它具有多种表现形式&#xff0c;可以是文字、图形、图像、声音和语言等。信息&#xff08;information&#xff09;&#xff1a;是现实世界事物的存在方式或状态的反映。信息具有可感知…