如果我用C写:

int num;

在我给num赋值之前,num的值是不确定的吗?

推荐答案

静态变量(文件范围和函数静态)初始化为零:

int x; // zero
int y = 0; // also zero

void foo() {
    static int x; // also zero
}

非静态变量(局部变量)为indeterminate.在赋值之前读取它们,结果为undefined behavior.

void foo() {
    int x;
    printf("%d", x); // the compiler is free to crash here
}

在实践中,它们一开始往往只是有一些无意义的值——一些编译器甚至可能会输入特定的固定值,以便在调试器中查看时变得明显——但严格来说,编译器可以自由地执行任何操作,从崩溃到调用demons through your nasal passages.

至于为什么它是未定义的行为而不是简单的"未定义/任意值",有许多CPU体系 struct 在其表示中为各种类型添加了额外的标志位.一个现代的例子是the Itanium, which has a "Not a Thing" bit in its registers;当然,C标准的起草者正在考虑一些较旧的体系 struct .

try 使用设置了这些标志位的值可能会导致CPU在操作中出现异常,really不应该失败(例如,整数加法或分配给另一个变量).如果你不初始化一个变量,编译器可能会在设置了这些标志位的情况下拾取一些随机垃圾,这意味着触碰这个未初始化的变量可能是致命的.

C++相关问答推荐

命名信号量不会像进程之间同步中假设的那样工作

有效地计算由一组点构成的等边三角形和等腰三角形的数量

如何将不同长度的位转换成字节数组?

DPDK-DumpCap不捕获端口上的传入数据包

GCC引发不明确的诊断消息

如何一次获取一个字符

C:二进制搜索和二进制插入

如何在IF语句中正确使用0.0

在一个小型玩具项目中实现终端历史记录功能

在C++中通过空指针隐式访问常量变量的值

GCC创建应用于移动项的单独位掩码的目的是什么?

加密解密工作正常,但返回错误0x80090005

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

';\n&39;和';\r&39;中的';\n&39;之间有什么关系?

如何将C中的两个字符串与从文件接收的字符串中的字符数进行比较

GetText不适用于包含国际字符的帐户名称

如何组合两个宏来初始化C语言中的字符串数组?

C 程序不显示任何输出,但它接受 CS50 Lab1 的输入问题

如何修复数组数据与列标题未对齐的问题?

将字节/字符序列写入标准输出的最简单形式