使用未初始化的變數
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.
}
請注意,上面的程式碼本身可能不會導致錯誤或分段錯誤,但稍後嘗試取消引用此指標將導致未定義的行為。