使用未初始化的变量
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.
}
请注意,上面的代码本身可能不会导致错误或分段错误,但稍后尝试取消引用此指针将导致未定义的行为。