gpt4 book ai didi

c - C中的静态变量如何在内存中持久化?

转载 作者:行者123 更新时间:2023-12-05 08:18:08 26 4
gpt4 key购买 nike

我们都知道静态变量如何工作的常见示例 - 在具有某个值(假设为 5)的函数中声明静态变量,函数将其加 1,并且在下一次调用该函数时变量将具有修改后的值(在我的示例中为 6)。

幕后是如何发生的?是什么让函数在第一次调用后忽略变量声明?如果函数的堆栈帧在调用完成后被“销毁”,该值如何保留在内存中?

最佳答案

static 变量和其他具有static 存储期限 的变量存储在栈外的特殊段中。通常,除了在调用 main() 之前初始化静态存储持续时间变量之外,C 标准没有提及这是如何完成的。然而,现实世界中绝大多数计算机的工作方式如下所述:

如果你用一个值初始化一个静态存储持续时间变量,那么大多数系统将它存储在一个名为 .data 的段中。如果您不对其进行初始化,或将其显式初始化为零,它将存储在另一个名为 .bss 的段中,其中所有内容都是零初始化的。

难以理解的部分是,当我们编写如下代码时:

void func (void)
{
static int foo = 5; // will get stored in .data
...

然后包含初始化的行在函数第一次进入时执行(在初学者类(class)中经常讲授)——它根本不在函数内部执行,它是在函数执行期间总是被忽略。

甚至在调用 main() 之前,“C 运行时库”(通常称为 CRT)运行各种启动代码。这包括将值复制到 .data.bss 中。所以上面这行实际上是在你的程序开始之前执行的。

所以当 func() 第一次被调用时,foo 已经被初始化了。与任何其他变量一样,函数内部对 foo 的任何其他更改都将在运行时发生。

This example说明程序的各种内存区域。 What gets allocated on the stack and the heap?给出了更通用的解释。

关于c - C中的静态变量如何在内存中持久化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64549276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com