在C中使用INT_MAX宏和未初始化的值

时间:2014-12-07 03:33:09

标签: c

为什么这段代码不会产生编译时错误? INT_MAX是一个宏,它保存可存储在int中的最大值,但未声明minVal,并在打印时生成值0。我用c99编译。

#include <limits.h>
#include <stdio.h>

int main() {
    int max = INT_MAX, minVal;
    printf("Value of max: %d", max);
    printf("Value of minVal: %d", minVal);

    // Output
    // 2147483647
    // 0

    return 0;
}

3 个答案:

答案 0 :(得分:1)

编译器不需要将minVal置于此处的自动变量初始化为任何内容。

安全选项是初始化它。

如果您希望编译器在您不在时发出警告,则可以设置命令行选项。在gcc中,-Wall将完成这项工作,但-Wunitialized会更具体地执行此操作。 (据我所知,您提到的C99可能是gcc的包装器。)

答案 1 :(得分:1)

在您的程序中minVal已声明并已定义,但从未初始化。

您的程序通过访问minVal函数调用中未初始化的对象printf来调用未定义的行为。

当已知程序调用未定义的行为时,

C不需要编译器的诊断或转换错误。允许编译器输出诊断或停止转换(除其他外)但不是必需的。

答案 2 :(得分:0)

您将minVal声明为本地int变量,在这种情况下,您从它读取0是因为它是初始值,但请注意,如果不将其初始化为零,则每个局部变量不会始终为零(在变量声明时= 0),因为标准不要求它为零(局部变量在堆栈中分配,因此由于先前使用堆栈区域而具有未定义的初始值) 只有全局变量的默认值为初始值