当前位置: 首页 > 面试题库 >

静态变量初始化?

金健
2023-03-14
问题内容

我想知道为什么默认情况下C,C ++和Java中的确切静态变量初始化为零?为什么对局部变量不是这样?


问题答案:

为什么要对静态变量进行确定性初始化而对局部变量不进行初始化?

了解如何实现静态变量。 它们的内存在链接时分配,并且它们的初始值也在链接时提供。 没有运行时开销。

另一方面,用于局部变量的内存是在运行时分配的。堆栈必须增长。你不知道以前在那里。如果需要,可以清除该内存(将其清零),但这会导致运行时开销。 C
++的理念是“您不为不使用的东西付费”,因此默认情况下它不会将内存归零。

好的,但是为什么将静态变量初始化为零,而不是其他一些值?

好吧,您通常希望对该变量执行某些操作。但是,您如何知道它是否已初始化?您可以创建一个静态布尔变量。但是随后还必须将其可靠地初始化为某种值(最好是false)。
指针呢?
您希望将其初始化为NULL,而不是一些随机垃圾。
结构/记录如何?它内部还有其他一些数据成员。将它们全部初始化为其默认值是有意义的。但是为简单起见,如果使用“初始化为0”策略,则不必检查单个成员并检查其类型。
您可以将整个存储区初始化为0。

这实际上不是技术要求。如果默认值不是0,则初始化的语义仍可以认为是明智的,但仍是确定性的。但是,那该值是多少?您可以很容易地解释为什么使用0(尽管实际上听起来有些随意),但是解释-1或1024似乎更难(尤其是变量可能不足以容纳该值,等等)。

而且,您始终可以显式初始化变量。

而且,您始终拥有C ++标准的8.5.6段,其中指出:“静态存储持续时间的每个对象都应在程序启动时初始化为零”。



 类似资料:
  • 问题内容: 如何在Java中初始化类的私有静态成员。 尝试以下操作: 但是在创建类A的第二个对象然后调用f1()时,我得到了空指针异常。 问题答案: 初始化静态成员的首选方法是(如上所述) 或者对于更复杂的初始化代码,您可以使用静态初始化程序块:

  • 问题内容: 我有以下代码: 这给了我以下错误: 解析错误:语法错误,在第19行的/home/user/Sites/site/registration/inc/registration.class.inc中出现意外的’(’,期待’)’ 所以,我想我做错了什么…但是如果不那样做怎么办?如果我用常规字符串更改mktime内容,它将起作用。所以,我知道我能做到这一点 的那种 像.. 有人有指针吗? 问题答

  • 问题内容: 我想知道静态变量何时初始化为其默认值。加载类时,先创建(分配)静态变量,然后执行静态初始化程序和声明中的初始化是否正确?在什么时候给出默认值?这导致前向参考的问题。 另外,如果你可以参考“ 为什么没有及时初始化静态字段?”这一问题进行解释,尤其是Kevin Brock在同一网站上给出的答案。我不明白第三点。 问题答案: 从请参阅Java静态变量方法: 它是一个属于类而不属于对象(实例)

  • 问题内容: 当我运行此代码时,答案是1,我想应该是2。初始化的顺序和每一步中k的值是什么? 编辑1:作为后续的“ k设置为默认值”,那么为什么下一个代码不能编译?出现错误“在定义字段之前无法引用它”。 编辑2:出于某种我不知道的原因,它^可以在其“ Test.k”代替“ k”时使用。 感谢所有的答案。这将满足:D 问题答案: 它们按照您编写它们的顺序执行。如果代码是: 然后输出变为2。 初始化的顺

  • 我正在经历对我来说毫无意义的奇怪行为。以下程序(我试图将其简化为最小的示例)因而崩溃,因为为: 我希望它打印: 但是如果(可以通过取消对main方法的第一行的注释或对以下两行重新排序来完成),程序将正确终止。 我怀疑这个问题与Java类初始化顺序有关,但我在相关JLS部分中找不到任何解释。 所以,我的问题是:这到底是怎么回事?这是某种虫子还是我错过了什么? 我的JDK版本是1.8.0_111

  • 本文向大家介绍C ++静态成员变量及其初始化,包括了C ++静态成员变量及其初始化的使用技巧和注意事项,需要的朋友参考一下 静态C ++成员变量是使用static关键字定义的。类中的静态成员变量由所有类对象共享,因为在内存中只有它们的一个副本,而与该类的对象数量无关。 如果没有以任何其他方式初始化静态类成员变量,则在创建类的第一个对象时将其初始化为零。 给出了一个演示静态成员变量及其在C ++中的