全局变量、局部变量、静态全局变量、静态局部变量在内存里的区别以及栈与堆的区别

2023-05-16

1.先理解和区分这几个概念

举个例子:四个所在的位置如下:

//main.cpp 
int a = 0;             //全局变量
static int b=0;        //静态全局变量
main() 
{ 
    int c;             //局部变量
    static int d;      //静态局部变量 
}

故:

 

  • 全局变量:具有全局作用域,全局变量只需在一个源文件中定义,就可以作用于所有的源文件(使用extern跨)。
  • 静态全局变量:具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被 static 关键字修饰过的变量具有文件作用域。(不能像全局变量那样跨不同的源文件
  • 局部变量:具有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
  • 静态局部变量:具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在

2.存储方式

- 代码区,是编译器生成的一个exe区段,拥有可读和可执行属性。存放函数体的二进制代码。 
- 栈区,低地址(小于exe基地址),拥有可读写属性,exe中没有对应的区段,系统加载dll时自动生成,由于内存地址使用方式从大往小减,所以数量有限,尽量不要定义过大的数组变量const的局部变量也是放在栈里的,而不是放在常量区。由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 
- 堆区,就是malloc和new之类内存所在区段,拥有可读写属性exe中没有对应的区段,系统加载dll时自动生成,首先是利用栈区地址下面的区段,也是低地址,当用完了,会自动分配稍微高一点地址(大于exe基地址)。 malloc和new都在这里分配内存。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 
- 全局数据区,是编译器生成的一个exe区段,拥有可读写属性,初始和未初始化的全局和静态变量都放在这里。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放。 
- 常量区,是编译器生成的一个exe区段,只有可读属性,比如char s = ” hello world” ,这时候” hello world” 就在常量区,由于没有可写属性,所以修改内容会出错,另外全局的const变量也放在常量区里。

小结:在 C/C++ 中static的作用 https://www.runoob.com/w3cnote/cpp-static-usage.html

  • 1)在修饰变量的时候,static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期直到程序运行结束以后才释放
  • (2)static 修饰全局变量的时候,这个全局变量只能在本文件(如*.C中)中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以。
  • (3)static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为 0。
  • (4)不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用 static 修饰
  • (5)考虑到数据安全性(当程序想要使用全局变量的时候应该先考虑使用 static)。

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

全局变量、局部变量、静态全局变量、静态局部变量在内存里的区别以及栈与堆的区别 的相关文章

  • 关于Runnable 和 Thread的应用场景

    摘自StackOverflow 个人觉得比较靠谱的答案 xff0c 细节请看url http stackoverflow com questions 541487 implements runnable vs extends thread
  • RT-Thread嵌入式操作系统 开发笔记(上)

    更详细的参考链接 0 准备 xff1a 环境准备 xff1a MDK ARM 5 30 正式版或评估版 xff0c 5 14 版本及以上版本均可 43 破解软件 STM32F103 pack 库文件 百度云盘云盘文件 1 文件 xff0c
  • RT-Thread嵌入式操作系统 开发笔记(中)

    9 生产者消费者问题模型 xff08 验证代码producer consumer c xff09 生产者消费者问题是 一个经典的 多线程同步问题 有两个线程 一个生产者线程和一个消费者线程 两个线程共享二个初始为空 固定大小为n的缓存区 生
  • 嵌入式软件基础问题-转

    volatile关键字的作用 直译为 易变 xff0c 与const相反 用volatile定义的变量 xff0c 在每一次被访问时都是从内存中读取该量的值 xff0c volatile不允许编译器优化该值到寄存器 xff0c 所以取值时不
  • 嵌入式操作系统RT-Thread和Freertos资源对比总结 转

    Freertos是一个国外推出的一个迷你的实时操作系统内核 xff0c 开源 xff0c 功能包括 xff1a 任务管理 时间管理 信号量 消息队列 内存管理 记录功能 软件定时器 协程等 xff0c 可基本满足较小系统的需要 RT Thr
  • 虚拟机更改IP 连接失败 问题解决Destination Host Unreachable

    问题1 xff1a 虚拟机原来是ens33的ip 1 100 xff0c 可以联网 xff0c 改为3 66就无法联网 xff0c 再改回1 100 xff0c 依然无法联网 如图 解决方法 xff1a 重启网卡管理器即可 xff1a se
  • NUC980 jtag0 默认管脚复用问题

    NUC980DK61YC 使用G13 xff08 管脚编号是205 xff09 用作普通io口 xff0c 出现报错 报错 xff1a echo 205 gt sys class gpio export Please Check GPIOG
  • usb的device模式hid配置错误点

    将usb做从机 xff0c hid通信操作 xff08 模拟串口 xff0c 模拟u盘 xff0c hid通信 xff09 内核设定 1 模拟u盘 2 模拟串口 3 hid通信 1 报错 xff1a insmod libcomposite
  • nuc980 串口问题 串口断帧 丢帧问题

    NUC980 的性能不错 xff0c 串口速率号称达到3Mbps xff08 代码级有4M的极限 xff09 xff0c 并且带有流控性能 xff1b 经过单独测试3Mbps下有千分之三的丢包率 xff08 NUC980和电脑的串口助手交互
  • 2021-09-14 uboot移植开发

    引言 xff1a 最近要改动uboot xff0c 实现像微软PC上 xff0c u盘一键刷机或手机上安全模式下刷机的操作 专门去好好研究了点uboot的启动过程 xff1b 以下为总结 xff1a 嵌入式系统 微软 PC bootload
  • JAVA 泛型中的<T> 和 <?> 的应用场景

    在JAVA 泛型中 xff0c 经常看到 lt gt 应用场景为当不确定类型时 因为泛型的输入参数是类型 xff0c 而有一些状况下我们并不能确定类型
  • 当ctrl + c无法打断linux应用程序的执行时(CPU占比过大),该注意什么 ?

    如题 xff0c 问题显示如下 xff1b 经过测试 xff1a 发现是线程资源无法及时是否导致的 xff1b 每个线程都是while xff08 1 xff09 如果线程之间没有设置优先级的话 xff1b 当一个线程的while xff0
  • uboot内读写gpio操作实现

    目的 xff1a 为uboot添加判断gpio电平的操作 xff0c 修改对内核的跳转 1 查参考手册Register Map R read only W write only R W both read and write 在uboot跳
  • 文件传输校验-crc32校验算法

    文件传输校验 xff0c 用于升级的时候使用较多 xff1b 场景 xff1a 传输前先获取文件长度 xff0c 获取文件内容 xff0c 然后对文件校验 获得u32的校验信息变量 xff1b 设定每包长度 xff0c 将其封装到握手包 x
  • 打包QT的exe程序,解决Qt5Guid.dll,QtNetwork.dll等找不到的问题

    解决问题 xff1a 在用qt写完一个项目之后 xff0c 要生成一个exe文件 xff0c 让他人使用 打包程序 xff0c 工具 xff1a windows下的qt5 12 1 发布 xff1a 发布这个选项的 xff0c 也就是左下角
  • 解决段错误,系统应用core dump的分析

    解决段错误 xff0c 系统应用core dump的分析 这个错误在单片机上往往以hardfault的错误出现 xff0c 分析思路都是分析堆栈的位置 xff1b 单片机的编译软件 xff0c 如果可以仿真 xff08 比如keil或者IA
  • 作为无人机方面做嵌入式编写的飞控总结0

    导 xff1a 作为在专业公司的一名研制飞控 xff08 飞行控制器 xff09 的工程师 xff0c 飞控代码的编写会涉及方方面面 xff1b 如果团队是几十人或者个位的人数 xff0c 分配下来 xff1a 飞手 xff0c 销售 xf
  • 大疆osdk开发遇到的bug的解决 小结

    osdk 即dji大疆onboard sdk 用来做二次开发的的开发包 我使用的ONBOARD SDK 版本是 3 6 0 用于A3和N3的二次开发 官方的开发文档链接 xff1a https developer dji com onboa
  • 作为无人机方面做嵌入式编写的飞控总结1-基本协议驱动介绍1

    基本的驱动 要算标准的串口 iic和spi协议不可缺席 xff1b 1 作为单片机初学者必备知识点和重要知识点 xff0c 在linux系统编成之中依然还发挥很大作用 xff0c 因为这三个协议使用的是在太多了 xff1b 首先废话不多说
  • 作为无人机方面做嵌入式编写的飞控总结2-基础算法1-估算算法:

    基本协议的熟练使用 xff0c 解决你传感器读取原始数据 xff1b 打开了元件之间通讯的通路 xff1b 接下来 xff0c 对飞控就是数据处理算法作总结 xff1b 总结的基础算法包括 xff1a 估算算法和控制算法 61 61 61

随机推荐