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

Sla*_*ish 4 c multithreading memory-management

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

static int i = 42;
Run Code Online (Sandbox Code Playgroud)

变量i存储在哪里?它是数据部分吗?

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

static int j;
Run Code Online (Sandbox Code Playgroud)

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

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

j = 1;
Run Code Online (Sandbox Code Playgroud)

j现在将存放在哪里?

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

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

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

cni*_*tar 5

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

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

更有趣的是,物体不需要具有静态存储的方式ij你的例子做.如果在线程A的堆栈上有一个对象并且以某种方式设法将其地址传递给线程B,则B可以毫无问题地访问它.


为全局变量做静态文件范围变量的相同存储规则吗?

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