使用未初始化的变量

int a; 
printf("%d", a);

变量 a 是具有自动存储持续时间的 int。上面的示例代码试图打印未初始化变量的值(a 从未初始化)。未初始化的自动变量具有不确定的值; 访问这些可能会导致未定义的行为。

注意: 具有静态或线程本地存储的变量 (包括不带 static 关键字的全局变量)将初始化为零或其初始化值。因此以下是合法的。

static int b;
printf("%d", b);

一个非常常见的错误是不将用作计数器的变量初始化为 0.你可以向它们添加值,但由于初始值是垃圾,你将调用未定义的行为,例如在终端上的编译中发出指针警告和奇怪的符号

例:

#include <stdio.h>

int main(void) {
    int i, counter;
    for(i = 0; i < 10; ++i)
        counter += i;
    printf("%d\n", counter);
    return 0;
}

输出:

C02QT2UBFVH6-lm:~ gsamaras$ gcc main.c -Wall -o main
main.c:6:9: warning: variable 'counter' is uninitialized when used here [-Wuninitialized]
        counter += i;
        ^~~~~~~
main.c:4:19: note: initialize the variable 'counter' to silence this warning
    int i, counter;
                  ^
                   = 0
1 warning generated.
C02QT2UBFVH6-lm:~ gsamaras$ ./main
32812

以上规则也适用于指针。例如,以下结果导致未定义的行为

int main(void)
{
    int *p;
    p++; // Trying to increment an uninitialized pointer.
}

请注意,上面的代码本身可能不会导致错误或分段错误,但稍后尝试取消引用此指针将导致未定义的行为。