当前位置: 首页 > 知识库问答 >
问题:

在C中打印未初始化的变量时会发生什么?[副本]

麹承
2023-03-14

为什么打印32767(或其他一些随机数)?什么是 std::cout printing?为什么它不是 NULL(或 0)?

int main() 
{
    int a;
    std::cout << a;
}

共有3个答案

段干靖
2023-03-14

C 14(N3936)[dcl.init]/12:

如果没有为一个对象指定初始化器,那么这个对象就是默认初始化的。当获得具有自动或动态存储持续时间的对象的存储时,该对象具有不确定的值,并且如果没有对该对象执行初始化,则该对象保留不确定的值,直到该值被替换。

[...]如果评估产生不确定值,则行为未定义,除非在以下情况下:

并且您的代码不包括“以下情况”中的任何一种,这些情况包括允许传播<code>无符号字符</code>不确定值的几种情况。

傅高逸
2023-03-14

这是未定义的行为。您正在打印占用a内存的任何内容,在本例中,它恰好是32767

隗轶
2023-03-14

这是因为具有自动存储持续时间的变量在C中不会自动初始化为零。在C中,您不需要支付不需要的费用,并且自动初始化变量需要时间(将内存位置设置为零最终会减少为机器指令,然后将其转换为控制物理位的电信号)。

变量被保留在内存位置,并且恰好有一些垃圾位于该内存位置。该垃圾由cout打印出来。

正如@dwcanillas所指出的,这是一种未定义的行为。相关:C中声明的、未初始化的变量会发生什么?它有价值吗?

来自C标准(强调我的):

8.5初始化器[dcl.init]

7)默认初始化T类型的对象意味着:

    < li >如果T是一个(可能是cv限定的)类类型(第9条),则考虑构造函数。枚举适用的构造函数(13.3.1.3),通过重载解析(13.3)为初始化器()选择最佳构造函数。调用这样选择的构造函数,用一个空的参数列表来初始化

12)如果没有为对象指定初始化器,则该对象是默认初始化的。当获得具有自动或动态存储持续时间的对象的存储时,该对象具有不确定的值,并且如果没有对该对象执行初始化,则该对象保留不确定的值,直到该值被替换(5.18)。[注意:具有静态或线程存储持续时间的对象是零初始化的,参见3.6.2。-end note]如果评估产生了不确定值,则行为是未定义的,但下列情况除外:

-如果通过评估以下内容产生无符号窄字符类型(3.9.1)的不确定值:

— 条件表达式的第二个或第三个操作数 (5.16),

-逗号表达式(5.19)的右操作数,

—转换为无符号窄字符类型(4.7、5.2.3、5.2.9、5.4)的操作数,或者

— 丢弃值表达式(条款 5)

...

 类似资料:
  • 我想知道为什么输出值0。我认为如果一个变量没有初始化,它会输出一个垃圾值。 但是,我还记得听到整数的默认值为0,所以我有点困惑。 谢谢

  • 我正在尝试设置DBMS\U元数据的输出。将\u DDL获取到SQLPlus中的myRET\u VARbind变量。 我尝试了以下脚本。sql: 但我得到: SP2-1504:无法打印未初始化的LOB变量“RET\u VAL” 我还尝试用一个/块来围绕RET\u VAL的赋值: 但是,当我尝试在SQLPlus中运行它时,会出现以下错误: 第5行的错误:ORA-06550:第5行,第1列:PLS-00

  • 我已经检查过自己,我写了一个这样的程序 我运行了几次程序,结果始终是一样的,零。我在C中尝试过,结果是一样的。 但我的教科书说 如果未初始化函数内定义的变量,则该变量值将保持未定义状态。这意味着该元素具有以前驻留在内存中该位置的任何值。 当程序始终将可用内存位置分配给变量时,这怎么可能?它怎么可能是零以外的东西(我假设默认的可用内存值为零)?

  • 为什么未初始化的变量打印一个奇怪的负值?

  • 我在windows 10上运行cygwin。我在摆弄一些C语言,运行了这段代码很多次。我的笔记本电脑没有反应,几秒钟后,我得到了一个蓝屏,不得不重新启动。问题是,我所做的只是从内存中读取并打印到stdout,这不应该导致这种情况。我检查了一下,数组大小没有超过cygwin的最大堆栈大小。

  • 问题内容: TensorFlow中初始化变量的标准方法是 经过一段时间的学习后,我创建了一组新变量,但是一旦初始化它们,它将重置所有现有变量。目前,解决此问题的方法是保存所需的所有变量,然后在tf.initalize_all_variables调用之后重新应用它们。这有效,但是有点笨拙。我在文档中找不到像这样的东西… 有谁知道初始化未初始化变量的好方法吗? 问题答案: 没有优雅的方法可以枚举图中的