c - 是否可以在声明它的函数之外访问静态局部变量?

标签 c

对于在 C 函数中定义的静态变量,如下所示:

int f1()
{
   static int var2 = 42;
   var2++;
   printf("var2=%d\n", var2);
}

var2 将存储在 .data 段中(因为它被显式初始化为 42,感谢@busybee 指出这一点):

0000000000004014 l     O .data  0000000000000004              var2.2316

var2 如果我没有显式初始化它或将其初始化为 0 将存储在 .bss 段中):

000000000000401c l     O .bss   0000000000000004              var2.2316

var2有2个方面:

  • 它的生命周期与整个程序相同。
  • 但它的范围仅限于f1()之内。

bss 部分用于未初始化的全局数据。而 data 部分用于初始化全局数据。 var2 存在于 bss 中,因此在某种意义上它必须是全局的。

我认为var2只能在f1()中访问的原因只是编译器放置的一些句法规则。如果我们遍历 bss 部分,则 var2 必须可以从 f1() 外部访问。我说得对吗?谢谢。

最佳答案

好吧,您可以对内存进行原始访问,所以整个世界都属于您,但它们有限的访问范围正是使用静态局部变量的全部意义所在。

它们是具有受控访问的全局状态,因此您可以应用本地推理。

如果您可以从外部访问它们,那么本地推理就可以解决了。此时,人们应该想:为什么不直接使用常规的全局变量?

关于c - 是否可以在声明它的函数之外访问静态局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73516649/

相关文章:

c - 如何自动登录 ssh 服务器并运行一些命令来修改文件

c - 如何链接链表中的不同节点并遍历它

c - C 编程语言 (K&R) - 练习 1-13

c - fwrite() 阻止调用并且不写入文件

c++ - 如何在 GNU C 中使用 mcheck 进行堆一致性检查?

c - 函数 malloc 一个指针并将数据读入其中,但调用者无法访问它

mysql - C 程序和 Ruby on Rails 应用程序之间传递数据的方式

c - GTK 代码无法链接(win7-64bit、C、msys64)

c - 第一个 DGRAM 没有 IP

c - 如何在 CLion 中自动生成和更新 .h 文件的函数声明(原型(prototype))?