C:所有线程都可以使用文件范围变量吗?

时间:2014-07-02 19:57:19

标签: c multithreading memory-management

如果我在声明并初始化的函数外的文件中有变量:

static int i = 42;

变量i存储在哪里?是Data section吗?

如果我在函数外部的文件中有变量,则声明但未初始化为:

static int j;

变量j存储在哪里?是BSS吗?

我认为默认情况下j会被初始化为零,所以如果我稍后会这样做:

j = 1;

现在将j存储在哪里?

现在对我真正感兴趣的部分是:所有线程都可以使用静态文件范围变量吗?

我问,因为堆当然可用于所有线程,但每个线程都有自己的堆栈,之前我曾假设静态文件范围变量放在堆栈上,就像在函数内声明的变量一样。

出于好奇 - 静态文件范围变量的相同存储规则是否也适用于全局变量?

1 个答案:

答案 0 :(得分:5)

  

现在对我真正感兴趣的部分是静态文件范围   所有线程都可用的变量

是的,所有线程都可以访问整个地址空间。

更有趣的是对象不需要静态存储ij在您的示例中的方式。如果在线程A的堆栈上有一个对象,并以某种方式设法将其地址传递给线程B,B可以毫无问题地访问它。


  

对静态文件范围变量执行相同的存储规则   对于全局变量?

这两者都有所谓的静态存储"。在任何函数static之外声明的变量的上下文中,只是使其在翻译单元之外不可见。