作用域&内存空间

2023-11-16

作用域

C 语言编译器可以确认 4 种不同类型的作用域:代码块作用域、文件作用域、原型作用域和函数作用域。

  • 文件作用域:
    全局变量
    函数名

链接属性

简单的来说,编译器将你的源文件变成可执行程序需要经过两个步骤:编译和链接。编译过程主要是将你写的源代码生成机器码格式的目标文件,而链接过程则是将相关的库文件添加进来(比如你在源文件中调用了 stdio 库的 printf 函数,那么在这个过程中,就把 printf 的代码添加进来),然后整合成一个可执行程序。
这里写图片描述
链接属性是个什么东西呢?
我们知道大型的程序都有好些个源文件构成,那么在不同文件中的同名标识符,编译器是如何处理的呢?这就要看链接属性了。

在 C 语言中,链接属性一共有三种:

  • external(外部的)– 多个文件中声明的同名标识符表示同一个实体,在所有文件可以访问
  • internal(内部的)– 单个文件中声明的同名标识符表示同一个实体,在该文件中可访问
  • none(无)– 声明的同名标识符被当作独立不同的实体,在作用域中可访问

只有具有文件作用域的标识符才能拥有external,internal属性,其他作用域的都是none属性。
具有文件作用域的标识符默认为external属性,允许跨文件访问。对external属性的关键字使用static关键字可以将external改为internal属性(对于其他作用域的标识符是另一种功能)。

生存期

  • 静态存储期:具有文件作用域的变量和函数,还有静态局部变量。只有程序关闭,内存释放

  • 自动存储期:

变量存储类型:

  • auto
  • register 寄存器在cpu内部
  • static
  • extern
  • typedef

C 语言程序的内存空间

这里写图片描述
栈:局部变量,函数参数,返回值等,由系统自动分配和回收
堆:动态申请的内存空间,由程序员手动分配和释放
BSS:未初始化的全局变量或静态变量
数据段:初始化的全局变量或静态变量
代码段:包含只读的常数变量,字符串常量

局部变量
动态申请的内存空间
全局变量(未初始化)
静态变量(未初始化)
静态变量(初始化)
全局变量(初始化)
字符串常量
函数

动态内存管理

#include <stdlib.h>

malloc申请动态内存空间
calloc申请并初始化为0的动态内存空间
realloc重新分配内存空间
free释放动态内存

内存泄露:

  • 隐式内存泄露,用完内存块没有及时free
  • 丢失内存块地址,如之前内存块的指针被重新赋值,无法再访问内存块。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

作用域&内存空间 的相关文章

  • 带有 Windows 窗体应用程序的地图

    我正在构建一个需要地图的 C Winforms 应用程序 例如 Google 地图 Bing 地图等 但我对 ToU 许可 非商业使用等感到非常困惑 我的问题 您建议将哪个地图提供商 最好是免费的 嵌入到 winforms 应用程序中以用于
  • 类变量在其定义范围内?

    这可能是一个愚蠢的问题 我正在尝试制作文本泥 我需要每个 Room 类包含其他 Room 类 以便在尝试移动到它们或从它们获取信息时可以引用 但是 我不能这样做 因为我显然无法在其定义中声明一个类 那么 我该怎么做呢 当我说我做不到时 我的
  • 如何在运行 ASP.NET 页面时以编程方式设置表格背景?

    我有一个 aspx 页面 其默认背景颜色是一种 当选择单选按钮的某个选项时 我需要能够以编程方式更改它 我尝试设置表的 ID 字段 但似乎无法在 C 代码隐藏文件中访问它 我原来的表是 table style width 100 backg
  • 任务计划程序控制台输出在哪里? (C# 控制台应用程序)

    我正在运行 C Windows 控制台应用程序 并通过任务计划程序传递几个参数 它全天运行 将其他应用程序创建的平面文件数据加载到 SQL Server 中 该程序间歇性失败 并且我有 Try Catch 逻辑 该逻辑使用 Console
  • 在 IEnumerable 中查找相同的集合

    有一项任务要弄清楚如何更新表 DataTable 连接到一个database没有UPDATE陈述 我想出的例子是从邮箱中读取警报 该表将写入 Alerts 如果邮件正文包含单词 SUCCESS gt Alert 变为绿色 如果 FAIL g
  • ctypes.ArgumentError:不知道如何转换参数

    我在C库中定义了一个函数 如下所示 int Test char str1 int id1 char str2 float val float ls 我想在Python中使用它 所以我编写了以下Python代码 str1 a str2 b i
  • 类型定义存在于两个库中

    我正在使用 NET 4 5 构建 ASP NET Web 窗体网站 错误 The type System ComponentModel DataAnnotations Schema ForeignKeyAttribute exists in
  • C# 中 value 为匿名类型的字典

    是否可以在 C 中创建一个System Collections Generic Dictionary
  • 可以轻易移动,但不可轻易复制

    是否可以创建类类型 即 普通移动构造 但不是普通复制构造 但仍然可复制构造 普通复制构造 但不是普通移动构造 但仍然可移动构造 可以简单地复制分配 但不能简单地移动分配 但仍然可以移动分配 可以简单地移动分配 但不能简单地复制分配 但仍然可
  • 驱蚊程序?

    不 我认真的 最近 我读到 当电脑的压电蜂鸣器以一定频率振动时 声音可以驱赶蚊子 真的吗 如何以编程方式访问 PC 蜂鸣器 而不是扬声器 最好使用 C 我不知道有没有蚊子 但我的头疼得要命 啊啊 using System Runtime I
  • 在 .NET Core 上通过 MEF 将参数传递给插件构造函数?

    我花了几个小时试图弄清楚如何通过 MEF System Composition 将参数传递给插件构造函数 但一切都无济于事 不用说 相关文档很少 查看源代码也没有帮助 这曾经非常容易做到 使用 CompositionHost Compose
  • System.NotSupportedException:“集合是只读的。”从 iList 中删除对象时抛出

    运行下面的代码片段时抛出异常 我有一个 iListof webelements 如果该元素包含字符串 WSC 我想将其从 iList 中删除 谁能帮我吗 代码如下 IList
  • std::make_shared 作为默认参数无法编译

    在 Visual C 2008 和 2010 中 以下代码无法编译并出现以下错误 include
  • 变形:Opencv 使用 Visual Studio 将图像显示到曲面屏幕

    我正在尝试使用 opencv API 来扭曲图像 以便将其显示到曲面屏幕上 我已经浏览了opencv中提供的翘曲apihere http docs opencv org 2 4 modules stitching doc warpers h
  • 在浏览器中测试wcf服务

    我无法在浏览器中调用基本的 wcf web 方法 即使使用
  • OpenCV:处理每一帧

    我想使用 OpenCV 编写一个跨平台应用程序进行视频捕获 在所有示例中 我发现来自相机的帧是使用抓取功能进行处理并等待一段时间 我想处理序列中的每一帧 我想定义自己的回调函数 每次当一个新帧准备好处理时都会执行该函数 例如直播对于 Win
  • 从资源文件获取 DisplayName [重复]

    这个问题在这里已经有答案了 我在 App GlobalResources 文件夹中有特定于文化的资源文件 现在我需要从此资源文件中读取 DisplayName 属性的值 我在用 Display Name MerchantName Resou
  • 为什么 istream/ostream 慢

    于 50 40http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Go
  • 所有区域的启用保护模式必须设置为相同的值(启用或禁用)

    我正在尝试使用Selenium Internet Explorer驱动程序 但当我尝试实例化它时它崩溃了 TestInitialize public void TestInitialise ieDriver new InternetExpl
  • 文件按文件名模式存在

    我在用 File Exists filepath 我想做的是将其替换为模式 因为文件名的第一部分发生了变化 例如 该文件可以是 01 peach xml 02 peach xml 03 peach xml 如何根据某种搜索模式检查文件是否存

随机推荐

  • 概率论入门

    概率论入门 导论 概率论解决随机问题的本质 就是把局部的随机性转变为整体上的确定性 概率论的产生 能让我们对未来随机事件发生做出数学上的确定性判断 这是概率论的思想基石 概率论作为一种数学工具的基本思路 正式基于这种整体的 全局性的思考框架
  • 无理数无理性的证明问题

    问题1 求证 2 sqrt 2 不是有理数 证明 假设 2 sqrt 2 是有理数 可设 2 pq sqrt 2 frac p q p q N p 12289 q in N q gt 1 q gt 1 且 p q p 12289 q互质 则
  • 用AI给图片上色 在线将黑白照片处理成彩色照片工具(干货)

    一个在线的网址 用此工具可以给黑白照片上色 刚刚测试了一下 效果算是可以吧 图片直接进行拖拽 或者是在页面点击添加 处理后点击download即可 AI智能上色 效果看起来还不错吧 下面是测试的 图片转换地址 https imagecolo
  • timesten常见的一些简单问题

    环境为 instance name为eservice安装目录为 home timesten TimesTen 下面这些问题是针对新手而言的 通过这些问题可以帮助刚接触timesten的人可以快速配置timesten more 如何启动 ho
  • 成为优秀程序员的方法就是抛开编程?

    原文 How To Become a Better Programmer by Not Programming 作者 Jeff Atwood 我在2006年写过一篇题为 Programmers as Human Beings 程序员 亦人类
  • Python自动化操作Excel表格

    目录 一 Python打开及读取Excel表格内容 二 Python向Excel表格中写 三 批量调整字体 样式 四 编程生成Excel内图表 一 Python打开及读取Excel表格内容 打开以及读取Excel表格内容 列 column
  • 查看Google Chrome浏览器里的Cookie 文件

    文章目录 环境 步骤 扩展 chrome postman自动带入cookie 参考 平时访问各种网站查阅资料时 总是会弹框询问是否可以保存Cookie信息等 于是就好奇 看下Cookie文件存在哪里的 本文主要是基于这个问题出发 不了解co
  • MAVEN常用命令

    Maven库 http repo2 maven org maven2 Maven依赖查询 http mvnrepository com Maven常用命令 1 创建Maven的普通java项目 mvn archetype create Dg
  • Apache Derby 数据库 - 教程

    阿帕奇德比 本文介绍如何安装 Apache Derby 数据库 如何启动 Derby 服务器 如何通过 Java 连接到 Derby 以及如何使用 Derby 命令行工具发出 SQL 语句 还解释了将 Apache Derby 安装为 Wi
  • BCompare 4 key SN 亲测可用

    支持BCompare 4 2 32位 亲测可用 key w4G in5u3SH75RoB3VZIX8htiZgw4ELilwvPcHAIQWfwfXv5n0IHDp5hv 1BM3 H1XygMtiE0 JBgacjE9tz33sIh542
  • 《机器学习》理论——速读学习2 常用方法(3)

    机器学习 理论 速读学习2 常用方法 3 该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 time 2021 12 24 学习目标 我需要了解神经网络除了工程化部分之外的更多内容 以便于在实际有效数据中可以获得抽象
  • ArcGis Server开发Web GIS新手体验(一)

    ArcGIS Server是ESRI公司最新推出的服务器端品 主要可以实现两大功能 强大的Web GIS系统的开发 分布式GIS系统的开发 ArcGIS Server其内核与ArcGIS Desktop和ArcGIS Engine一样 都是
  • Oracle数据库中日期的操作、主键自增与分页查询

    1 oracle数据库中的日期 在Oracle数据库中 DATE类型的存储范围为公历前4712年1月1日至公历后 9999年12月31日 这个日期范围也被称为Oracle库中支持的 Gregorian calendar 尽管在实际应用中一般
  • react 事件监听

    react事件监听 在react js里监听事件很容易 需要给被监听的事件元素加上属性类似于onclick onkeydown这样的属性 例如我们现在要给title 加上点击时间的监听 class Title extends Compone
  • 懒人神器:自动生成单元测试插件 Squaretest

    你是否常常因代码需编写单元测试而痛苦不堪 你是否因单元测试历史债而惆怅不断 Squaretest或许能帮你消除痛苦消除惆怅 前言 一 Squaretest是什么 二 使用步骤 1 引入插件 2 使用步骤 总结 背景 近来公司增加了代码质量门
  • Matlab_牛顿迭代法解非线性方程

    例 用牛顿迭代法 取x初值为1 5 解算非线性方程 x 3 x 1 0 的根 程序代码 manewton m function x manewton fun dfun x0 ep N if nargin lt 5 N 500 end if
  • matlab画一个正弦函数y=sin(x)(全网最简便,没有之一)

    本博日常打卡 x 0 pi 100 2 pi y sin x plot x y plottools 说明 plottools on 按照您上次使用时的布局在当前图窗上显示图窗选项板 绘图浏览器和属性编辑器 不带参数的 plottools 与
  • live reload enabled是什么意思_老外说“Pigheaded”什么意思?猪头三?才不是

    最近 猪肉价格 一路飞涨 老妈买完菜 每天都在唠唠叨叨 今天排骨又涨了xx块钱 五花肉又涨了xx 邻居家长里短 聊得都是 猪肉 简直像小猪佩奇花一亿买了 小区热搜榜 似的 所以 小编就想着倒腾一篇 猪猪 相关的英语知识 分享给大家 咳咳 蹭
  • 初级5 题目一 认识哈希函数和哈希表

    1 哈希函数的定义及性质 1 哈希函数是函数 所以接收一个变量 返回一个值 接收的变量 其定义域理论上是无穷大 返回的值是哈希值 也就是每个变量都能生成对应的哈希值 2 哈希函数的值域是有穷的 哈希值有穷个 并非无穷大 哈希函数相当于把无穷
  • 作用域&内存空间

    作用域 C 语言编译器可以确认 4 种不同类型的作用域 代码块作用域 文件作用域 原型作用域和函数作用域 文件作用域 全局变量 函数名 链接属性 简单的来说 编译器将你的源文件变成可执行程序需要经过两个步骤 编译和链接 编译过程主要是将你写