本文共 540 字,大约阅读时间需要 1 分钟。
明月笑刀无情
静态变量(文件范围和函数静态)初始化为零:int x; // zeroint y = 0; // also zerovoid foo() {
static int x; // also zero}非静态变量(局部变量)是不确定的。在分配值之前读取它们会导致未定义的行为。void foo() {
int x;
printf("%d", x); // the compiler is free to crash here}在实践中,它们最初只是有一些荒谬的价值 - 一些编译器甚至可能会在查看调试器时输入特定的固定值以使其显而易见 - 但严格来说,编译器可以自由地执行从崩溃到召唤的任何操作恶魔通过你的鼻腔通道。至于为什么它是未定义的行为而不是简单的“未定义/任意值”,有许多CPU架构在其各种类型的表示中具有额外的标志位。一个现代的例子是Itanium,它的寄存器中有一个“Not a Thing”位 ; 当然,C标准起草人正在考虑一些较旧的架构。尝试使用设置了这些标志位的值可能会导致操作中的CPU异常确实不应该失败(例如,整数加法或分配给另一个变量)。如果你继续保留未初始化的变量,编译器可能会设置这些标志位的随机垃圾 - 意味着触摸未初始化的变量可能是致命的。
转载地址:http://pzrav.baihongyu.com/