C程序内存分布及static变量

C程序内存分布及static变量

    • C语言中程序的内存分布 [🔗1](https://www.cnblogs.com/miaoxiong/p/11021827.html)[🔗2](https://blog.csdn.net/chen1083376511/article/details/54930191)
      • c/c++编译连接后二进制文件的存储
      • 动静态存储方式和存储区
        • 动态存储方式
        • 动态存储区
        • 静态存储方式
        • 静态存储区
    • static修饰[🔗](https://blog.csdn.net/stoic163/article/details/104711574)
      • static修饰的全局变量
      • static修饰的局部变量
      • static修饰的函数
      • 总结
    • 存储说明符[🔗](https://www.cnblogs.com/Natsumeno/p/14499173.html)

C语言中static类型表示“静态”或者“全局”的意思,用来修饰变量函数。经其修饰过的变量或函数作用域存储域会发生变化。

C语言中程序的内存分布 🔗1🔗2

c/c++编译连接后二进制文件的存储

  1. 代码段(text段)-- 可执行指令构成,程序在目标文件或内存中的一部分。通常只读,放置程序突发性的修改。

  2. 已初始化数据段(data段)-- 占程序虚拟地址空间一部分,包含全局变量静态变量(程序负责初始化这些变量)。 不是只读,运行时变量值可以变动。可细分为初始化只读区及初始化可读写区。

    //存储在初始化可读写区
    全局字符串 char s[] = "hello world";
    全局变量   int debug = 1;
    静态变量   static int i = 10; 
    //字符串"hello world"存储在初始化只读区  string指针存储在初始化可读写区
    常量修饰 const char* string  = "hello world";
    
    
    
  3. 未初始化数据段(bss段)-- 段内的数据在程序开始执行之前被内核初始化为0值,通常开始于已初始化数据段的末尾处。段内包含初始化为0的全局变量/静态变量以及源码中未显示进行初始化的变量。

    static int i;
    int j;
    
    
  4. 栈(stack) – 栈存储着自动变量以及每次函数调用时保存的信息,自顶向下增长;栈是属于线程的,每一个线程都有一个自己的栈。

  5. 堆(heap)-- 堆空间起始于bss段的末尾,并向高地址处生长。通常用作动态内存分配,通常由malloc realloc free管理,在一个进程中,堆空间被进程内所有的共享库及动态加载模块所共享。

进程运行时的典型内存布局

img

动静态存储方式和存储区

动态存储方式

==程序运行期间根据需要进行动态的分配存储空间的方式。==动态存储变量在程序执行过程中,使用它时才分配存储单元,使用完后立即释放。例如函数的形式参数函数定义时并不分配存储单元,函数调用时才分配。调用结束后立即释放。

动态存储区
  1. 堆和栈
  2. 局部自动变量
  3. 自动变量(未加static声明的局部变量)(3,4??)
  4. 函数调用时的现场保护和返回地址
  5. 动态变量(heap里由new/malloc分配的空间,声明周期到free结束)
静态存储方式

程序编译期间分配固定的存储空间的方式。

在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束。全局变量,静态变量等就属于此类存储方式。

静态存储区

包括常量、常变量(const 变量)、静态变量、全局变量等。

static修饰🔗

static修饰的全局变量

在全局变量之前加上关键字static,全局变量被定义为一个全局静态变量

  • 内存中的位置:静态存储区,在整个程序运行期间都都行
  • 初始化:未经初始化的全局静态变量会被程序自动初始化未0(未初始化的自动对象的值是任意的)
  • 作用域:全局静态变量在声明它的文件外是不可见的,从定义之处开始到文件结尾
  • 用处:不会被其他文件访问修改,其他文件可以使用相同名字的变量不会发生冲突

注:static修饰全局变量时,改变了全局变量的作用域(声明它的文件之外是不可见的),不过没有改变它的存放位置,还是在静态存储区中。

static修饰的局部变量

局部变量之前加上关键字static,局部变量被定义未一个局部静态变量

  • 内存中的位置:静态存储区
  • 初始化:未经初始化的局部静态变量会被程序自动初始化为0
  • 作用域:仍未局部作用域,在定义它的函数或语句块从定义开始到函数或语句块结束,作用域结束

注: 特点是用static修饰局部变量改变了其存储位置,从栈中变到了静态存储区,虽然作用域仍然为局部作用域,但是在离开作用域后没有被销毁,仍然存留在内存中,直到程序结束,当该函数被多次调用时可以再次访问,下次函数被调用时,可以访问最近一次被修改后的值。应该是这样哈。

static修饰的函数

在函数返回类型前加static,函数被定义为静态函数。函数的定义和声明默认是extern的静态函数只在声明其的文件中可见,不能被其他文件所用。因此文件内部调用的函数,可以定义为static的,如果有头文件也无需在头文件声明。有h文件和c文件的模块,开放给外部的接口函数才需要在h文件中声明。

  • 用处:其他文件中可以定义相同名字的函数,不会发生冲突,静态函数不能被其他文件所用。

总结

  1. 隐藏
  2. 保持变量内容持久,存储在静态数据区的变量会在程序刚开始运行时完成初始化,也是唯一一次初始化。共有两种变量存在静态存储区:全局变量和静态变量。不过静态变量可以控制可见范围。不过对于对局部变量添加static的修饰则就是为了让他保持仅是局部作用域但是局部作用域出了之后变量不被销毁>。
  3. 默认初始化为0,全局变量也具备这一属性。

存储说明符🔗

四种存储类别:auto register extern static

两种存储期:自动存储期(auto register) 静态存储期(extern static

  • auto:自动存储期变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销(消失)。

  • register:存储在CPU内部,而不是存在内存【需要内存寻址访问】,可以提高效率。该变量作为一个寄存器变量,让该变量的访问速度达到最快。循环中的变量需要被频繁使用时, 可以声明为register类型。

    限制:无法使用&获取变量地址;必须是一个单个值,长度应小于等于整形长度;局部静态变量不能定义为寄存器变量。

  • extern:声明一个全局变量/外部变量, 作用在整个程序工程。定义和声明分开且定义只能一次,声明可以多次。

static与auto

  • 变量在静态存储区被分配存储单元, 在程序运营期间都不释放。 但是auto 自动变量/局部变量, 在动态存储区空间, 函数调用后结束后即释放。
  • 只在编译时赋值一次, 【不赋值则默认为0】。 以后调用函数时不需要再次赋值,而是使用上次函数调用结束的值。 但是,为auto自动变量赋值, 不是在编译时进行赋值,而是在函数调用时进行赋值, 每调用一次,就重新赋一次初值。
  • 不给static变量赋值,默认为0,不给auto变量复制,值不确定。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贪心算法--将数组和减半的最小操作数

本题是力扣2208---点击跳转题目 思路: 要尽快的把数组和减小,那么每次挑出数组中最大的元素减半即可,由于每次都是找出最值元素,可以用优先队列来存储这些数组元素 每次取出最值,减半后再放入优先队列中,操…

Centos7使用kubeadm搭建k8s集群(一主两从)----(mac版)

一、环境准备 1、下载centos7镜像 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 下载地址: centos安装包下载_开源镜像站-阿里云 选择对应的版本即可,我下载的:CentOS-7-x86_64-DVD-2207-02.iso 2、使用VirtualBox安装centos 选择新建&#xff0c…

Rust 通用代码生成器莲花,红莲尝鲜版二十三,多对多候选,增强数据库反射项目功能

Rust 通用代码生成器莲花,红莲尝鲜版二十三,此版本新增了多对多候选功能,增强了数据库自动反射功能和模板向导的编辑器。请部署在 Tomcat9 的 webapps 目录下。 多对多候选功能大大增强了一个数据库自动反射成一个项目的功能,它可…

Docx文件误删除如何恢复?别再花冤枉钱了,4个高效恢复软件!

不管是工作还是学习,总是会与各种各样的文件打交道。文件量越多就越容易出现文件丢失、文件误删的情况。遇到这些情况,失去的文件还能找回来吗?只要掌握了一些数据恢复方法,是很有机会恢复回来的,下面我会将这些方法分…

MacBook Pro(Intel集成显卡)成功安装启动ComfyUI详细教程

Mac配置 MAC CPU: 2.2 GHz 四核Intel Core i7MAC 系统版本:12.3MAC 显卡: Intel Iris Pro 1536 MBMAC 内存:16Gpython 3.12.2 ComfyUI 的安装方法介绍 ComfyUI 是一个模块化的 Stable Diffusion GUI,工作界面是可视化的流程节点…

图神经网络——GCN,GraphSAGE

1、应用 生物化学:分子指纹识别、药物分子设计、疾病分类等 交通领域:对交通需求的预测、对道路速度的预测 计算机图像处理:目标检测、视觉推理等 自然语言处理:实体关系抽取、关系推理等 2、数据集介绍 CORA数据集由2708篇论文&…

影视极品转场音效大全,经典获奖通用音效素材

一、素材描述 本套音效素材,大小15.02G,16个压缩文件。 二、素材目录 01-华纳兄弟电影音效库合辑(2个压缩文件) 02-影视极品转场音效(2个压缩文件) 03-好莱坞经典综合音效(4个压缩文件&…

线程安全问题、同步代码块、同步方法

线程安全问题就是 用线程同步来解决线程安全问题 同步:一个线程接着一个线程等待执行 同步代码块: 通过锁来解决卖到重复票的问题:卖票问题和存钱取钱问题(见其他两篇文章) 同步方法:

杨辉三角的打印

题目内容: 在屏幕上打印杨辉三角。 思路: 首先我们通过观察发现,每一步的打印都与行列数有关,中间的数据由这一列和上一行的前一列数据控制。所以我们可以使用二维数组进行操作: (1&#xff…

用Rust解决鸡兔同笼问题

目录 一、什么是鸡兔同笼问题? 二、用Rust解决鸡兔同笼问题 三、鸡兔同笼问题在实际生活中的应用有哪些? 一、什么是鸡兔同笼问题? 鸡兔同笼问题是一种古代著名的数学问题,用于训练逻辑思维和解决方程的能力。 鸡兔同笼问题起…

API低代码平台介绍2-最基本的数据查询功能

最基本的数据查询功能 本篇文章我们将介绍如何使用ADI平台定义一个基本的数据查询接口。由于是介绍平台具体功能的第一篇文章,里面会涉及比较多的概念介绍,了解了这些概念有助于您阅读后续的文章。 ADI平台的首页面如下: 1.菜单介绍 1.1 O…

DNS 解析在网络传输中有什么意义?

首先我们先说说什么是DNS解析? DNS解析是将域名解析为对应的IP地址的过程。DNS它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS解析的过程就是寻找哪个IP地址对应你所输入的网址,然后将网页内容返回给用户…

GRS认证的优点和缺点是什么?

GRS认证(Global Recycled Standard)的优点主要体现在以下几个方面: 环保性:GRS认证鼓励和保证产品中使用更多的回收材料,从而减少对原始资源的需求和开采,有助于降低环境负荷,促进资源的循环利用…

案例研究|硬之城借助DataEase以数据驱动供应链精细化管理

深圳硬之城信息技术有限公司(以下简称为“硬之城”)成立于2015年,专注电子元件供应链领域,定位于电子产业供应链与智造平台。硬之城通过名为“Allchips”的集成式服务平台,为客户提供一站式的电子元件采购和供应链管理…

Redis + OpenResty 多级缓存

多级缓存 初识 OpenResty OpenResty - 开源官方站 基于 Nginx的高性能 Web 平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。 具备Nginx的完整功能基于Lua语言进行扩展,集成了大量精良的 Lua 库、第三方模块允…

基士得耶CP 6303c速印机不制版故障检修

故障:基士得耶CP 6303c经常提示版纸卡纸,重设版纸 版纸还没下滚筒,卡在版纸仓里面,手动滚动裁纸刀可以解决,但第二天又是这个毛病; 版纸定位传感器的灵敏度调节一下,然后给机器全面做个清洁大保养,尤其是传…

python中w、r表示什么意思

文件读写就是一种常见的IO操作。 文件读写操作步骤 不同的编程语言读写文件的操作步骤大体都是一样的,都分为以下几个步骤: 1)打开文件,获取文件描述符; 2)操作文件描述符--读/写; 3&#…

电商核心内容揭秘50:个性化广告与投放策略

相关系列文章 电商技术揭秘相关系列文章合集(1) 电商技术揭秘相关系列文章合集(2) 电商技术揭秘相关系列文章合集(3) 电商技术揭秘四十一:电商平台的营销系统浅析 电商技术揭秘四十二&#…

[MQTT]Mosquitto的內網連接(intranet)和使用者/密碼權限設置

[MQTT | Raspberry Pi]Publish and Subscribe with RSSI Data of Esp32 on Intranet 延續[MQTT]Mosquitto的簡介、安裝與連接測試文章,接著將繼續測試在內網的兩台機器是否也可以完成發佈和訂閱作業。 同一網段的兩台電腦測試: 假設兩台電腦的配置如下: A電腦為發…

沉浸式翻译插件:打破语言障碍的革命性工具

在全球化的今天,语言障碍一直是人们获取信息和沟通的主要难题之一。Immersive Translate(沉浸式翻译)的出现,为这一问题提供了一种创新的解决方案。本文将深入介绍Immersive Translate的功能、使用场景以及它如何帮助用户克服语言…