C中静态全局变量和非静态全局变量的区别[重复]

2024-01-12

“静态全局变量”和“静态全局变量”有什么区别 C 中的“非静态全局变量”?

请用一些例子解释它们有何不同。

(因为,全局静态变量和简单全局变量在整个程序中都保持活动状态,并且可以在任何块中使用。我很困惑如何区分它们。) 有人可以用代码解释一下吗?


基本上有四种情况:

  • 在函数外部声明,不带static
  • 在函数外部声明,带有static
  • 在函数内部声明,不带static
  • 在函数内部声明,带有static

让我们依次介绍这些内容。

在函数之外声明,没有static

这是一个传统的全球符号。您可以从任何源文件访问它(尽管在其他源文件中,您通常需要一个extern宣言)。

在函数之外声明,带有static

这是您所询问的“静态”全局。您只能在定义它的源文件中访问它。它对于该源文件是“私有的”,但您可以从该源文件中的任何函数访问它(实际上,该源文件中出现在其声明下方的任何函数)。与任何全局变量一样,它在程序的生命周期内保持其值。

在函数内部声明,不带static

这是一个传统的局部变量。您只能在该函数中访问它。每次调用该函数(包括递归)时,您都会获得该变量的一个新实例。如果不初始化它,它一开始就会包含一个不可预测的值。它不会在调用之间保持其值。

在函数内部声明,带有static

这是一个静态局部变量。您只能在该函数中访问它。它只有一份副本,在该函数的所有调用(包括递归调用)之间共享。如果不初始化它,它就会从零开始。它在调用之间保持其值。

在其中三种情况下,如果您不提供显式初始化程序,则保证变量被初始化为 0。但在真正的局部变量的情况下,如果您不提供显式初始化程序, 它一开始包含一个不可预测的值,您不能依赖它。

形式上,这里有两个概念,能见度 and lifetime。真正的全局变量在程序中的任何位置都是可见的。静态全局变量仅在其源文件中可见。局部变量仅在其函数中可见。所有全局变量和所有静态变量都有静态持续时间——它们的持续时间与程序一样长。 (这些变量也保证被初始化为 0。)真正的局部变量具有“自动”持续时间——它们随着包含函数的调用和返回而出现和消失。

与持续时间密切相关的是变量实际存储在哪里的问题。静态持续时间变量通常存储在数据段中。自动持续时间变量通常(但不一定)存储在堆栈中。

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

C中静态全局变量和非静态全局变量的区别[重复] 的相关文章

  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File

随机推荐

  • 异步 MVVM 命令

    我一直在关注 Stephen Cleary 在 MSDN 杂志上发表的相当优秀的系列文章 异步 MVVM 应用程序的模式 https msdn microsoft com en us magazine dn630647 aspx 并一直在使
  • pydicom“数据集”对象没有属性“TransferSyntaxUID”

    我正在使用 pydicom 1 0 0a1 从下载here https github com pydicom pydicom 当我运行以下代码时 ds pydicom read file DR abnormal abc dcm force
  • 一个季度的周数

    我试图根据日期获取给定季度的周数 我目前有这个公式 1 WEEKNUM EDATE Y4 1 WEEKNUM DATE YEAR EDATE Y4 1 LOOKUP MONTH EDATE Y4 1 1 4 7 10 1 But for J
  • 没有名为 urllib3 的模块

    我编写了一个调用 API 的脚本 并于上周成功运行了它 这周 它不会运行 我收到以下错误消息 Traceback most recent call last File user audit py line 2 in
  • 对基于 REST 的 API 到底是什么感到困惑

    我试图了解基于 REST 的 API 到底是什么 据我了解 这只是在 API 中编写函数的约定 所有函数都应该是 GET POST DELETE PUT 形式吗 因此 例如 REST API 中的函数可以是 public string ge
  • 将虚拟地址转换为物理地址

    The following page table is for a system with 16 bit virtual and physical addresses and with 4 096 byte pages The refere
  • endUpdates 后 UITableView 部分页脚视图位置

    在 ios8 上 我使用核心数据表视图控制器 删除行后 我的部分页脚视图突然一直下降到底部UITableView 当我滚动表格视图时 页脚视图返回到其位置 如何解决这个问题以及为什么会发生这种情况 这是代码以防万一 void control
  • Spark 读取镶木地板文件时出现问题

    我有 2 个镶木地板零件文件part 00043 0bfd7e28 6469 4849 8692 e625c25485e2 c000 snappy parquet 是 2017 年 11 月 14 日运行的部分文件 和part 00199
  • Cube、Rollup 和 GroupBy 运算符之间有什么区别?

    我找不到有关差异的任何详细文档 我确实注意到了差异 因为交换时cube and groupBy函数调用 我得到不同的结果 我注意到对于结果使用cube 我在以前使用的表达式上得到了很多空值groupBy 它们的工作方式不同 groupBy简
  • 如何控制鼠标光标? [复制]

    这个问题在这里已经有答案了 我的表单只有几个按钮 我想知道现在光标下有什么按钮 附 也许它是重复的 但我找不到这个问题的答案 看一下GetChildAtPoint http msdn microsoft com en us library
  • 自定义 QStyledItemDelegate 以绘制多种颜色的文本

    我想在一个中显示两列QTableWidget显示两次刺痛之间的差异 通过之前的一些编辑距离算法计算 这些部分存储在每个部分的数据中QTableWidgetItem as a QStringList 第一部分必须显示为黑色 接下来的部分必须显
  • 如何通过poi为word中的不同部分设置页码

    我的文档由三部分组成 封面 内容和正文 我想为每个部分设置不同的页码 封面不需要页码 内容页码采用罗马数字 正文页码采用希腊数字 用POI可以实现吗 Apache poi到目前为止 只有 abel 创建了三种类型的页眉 页脚 页眉页脚类型
  • Java FileReader 找不到文件

    我决定开始一个新问题 以便它可以严格关注 FileReader 错误 这是一种接受文件名和新文件所需的输出名称的方法 假设输入的文件名是 hello txt 该方法使其类似于 home User hello txt 它作为参数进入 File
  • 获取配置文件的跨平台路径(C/C++)

    我想将应用程序的设置存储在配置文件中 在 Linux 和 Mac 下 这 可能 是 home user config app conf 而在 Windows 下 它 可能 是 C Documents and Settings usernam
  • 如何获取Windows域名?

    我如何获取机器的域名 如果机器实际上已加入域 当然 如果机器没有加入域 该函数应该返回 null or 一个空字符串 或者 机器的名称 或 Notes the NetGetJoinInformation http msdn microsof
  • 将地址清理程序与 MSVC 结合使用时应用程序崩溃

    我正在尝试将地址清理程序与 MSVC 一起使用 Visual Studio 安装程序显示我有 Visual Studio Community 2019 版本 16 9 0 我有最基本的C 程序 int main return 0 CMake
  • 我应该如何从串行端口数据触发的 C# 事件更新我的 UI?

    我是一名技术级员工 帮助在制造测试环境中进行一些编码 具体问题是在 C 中处理事件 不仅仅是 Button click 特别是如果我有一个通过串行端口传入的数据流 并且必须根据通过串行端口传入的内容实时更新 UI 例如 如果我有两种方法最终
  • WordPress 主题上传错误 PCLZIP_ERR_BAD_FORMAT

    我对 php 和 WordPress 都很陌生 但是由于某些需要 我只能使用 WordPress 因此 首先我阅读了一个教程并创建了自己的 WordPress 主题 当我尝试上传我的主题时 出现以下错误 The package could
  • 这段Python代码(谷歌应用引擎)中产生“405 Method Not allowed”的原因是什么?

    我是一个 python 新手 我正在尝试构建一个应用程序 逐步复制我之前在课堂上教授的内容 但我收到了 405 Method Not allowed 错误 Here what the professor did 这是我所做的 有人能指出下面
  • C中静态全局变量和非静态全局变量的区别[重复]

    这个问题在这里已经有答案了 静态全局变量 和 静态全局变量 有什么区别 C 中的 非静态全局变量 请用一些例子解释它们有何不同 因为 全局静态变量和简单全局变量在整个程序中都保持活动状态 并且可以在任何块中使用 我很困惑如何区分它们 有人可