'initialization'到底是什么意思?

What does 'initialization' exactly mean?

本文关键字:意思 是什么 initialization      更新时间:2023-10-16

我的csapp书中说,如果全局和静态变量被初始化,那么它们就包含在ELF可重定位对象文件的.data部分中。

所以我的问题是,如果某些foo.c代码包含

int a;
int main()
{
a = 3;
}`

example.c包含

int b = 3;
int main()
{
...
}

是否只有b被认为是被初始化的?换句话说,初始化是否意味着在同一行中声明和定义?

它的意思正是它所说的。初始化的静态存储持续时间对象将在调用主函数之前设置其init值。未初始化将被归零。声明的第二部分实际上取决于实现,并且实现可以完全自由地进行归档。

当您声明不带关键字extern的变量时,您总是将其定义为

两者都被视为已初始化

它们初始化为零或初始化为常量(简而言之:如果右边是编译时常量表达式)。

如果允许,首先进行常量初始化(请参阅常量初始化那些情况的列表)。在实践中,常量初始化通常在编译时执行,并且预先计算的对象表示存储为程序图像。如果编译器不这样做,它仍然必须确保在任何动态初始化。

对于所有其他非本地静态和线程本地变量,零进行初始化。在实践中被初始化为零的被放置在程序的.bss段中映像,它在磁盘上不占用空间,并且被操作系统清零当加载程序时。

总之,如果实现不能恒定地初始化它,那么它必须首先进行零初始化,然后在发生任何动态初始化之前进行初始化。

在片段中:

int a;
int main()
{
a = 3;
}

a未初始化;它被分配。赋值是代码的运行时执行。例如,如果main被多次调用(不是,但任何用户函数都可以),则每次调用该函数时,a都被设置为3。

您的第二个片段是全局变量b初始化,它将被放置在.data段中。

我将以一般和完整的方式回答这个问题,而不是针对任何编程语言

声明、定义和初始化之间有很多混乱。有时它们看起来都很相似,有时却完全不同。

在理解差异之前,意识到两件事是非常重要的:

声明、定义和初始化之间的区别不同的编程语言会有所不同。每个程序都有它自己做这三件事的方式。你是什么"东西"定义、声明或初始化也会影响差异他们三个人之间。这个"东西"可以是一个变量、一个类或函数。它们都具有不同的定义含义,声明和初始化。一旦我们意识到以上两个事情是这样的,大多数疑虑都消除了,我们不再寻求确切的答案差异,因为它不存在。

一般而言(不考虑任何语言或"事物")

声明意味着我们正在对计算机说这个"东西"(它可以是变量、函数或类)存在,但我们不知道哪里在未来,我们可能会知道,但现在它只是存在在某处简单地说,我们在声明时不分配内存。我们可以多次声明那个"东西"。这个定义意味着我们对计算机说,这个"东西"需要内存,它需要位于某个地方。简单来说单词,定义意味着我们已经为它分配了内存。我们可以定义只有一次初始化意味着无论我们的"东西"是什么,我们都会给它一个初始值如果我们把那个位置保持为空,它可能是一个错误和错误的房子。初始化并不总是必要的,但它很重要。

许多人认为声明+定义=初始化。

这并没有错,但并不是所有地方都是正确的。它只适用于像C++或C.这样的语言中的变量

在python中,并没有声明的概念。我们不需要在里面申报任何东西。

三者的一般含义在任何地方都是有效的,但执行方式因语言和"事物"而异。

希望有帮助:)

  • 具有静态存储持续时间且初始化为零的变量最终会出现在.bss
  • 具有静态存储持续时间且用非零值初始化的变量最终会出现在.data

注意:C标准保证,如果程序员没有显式初始化具有静态存储持续时间的变量,如static int a;,则它会隐式初始化为零。因此CCD_ 13最终在CCD_ 14中结束。

这里的例子。


1)C11 6.7.9

如果具有静态或线程存储持续时间的对象未初始化明确地,那么:

  • 如果它具有算术类型,则初始化为(正或无符号)零