C語言的未初始化的數組的值為什麽是隨機的
阿新 • • 發佈:2018-07-26
urn turn 隨機 說明 tin main ont 情況 同學
突然想起來前幾天同學問我為什麽沒有初始化的數組的值是隨機的,發現這個困惑自己也是存在的,所以自己總結的心得.
1. 首先,並不是所有未初始化的數組的值都是隨機的.對於沒有初始化的數組,分兩種情況:
(1)全局數組,也就是定義在main函數外面的數組,元素的默認值是全部為0的
(2)局部數組,定義在函數內部的數組,其值默認是隨機的.
#include <stdio.h> #define LENGTH 5 int a[LENGTH]; int main() { for(int i=0;i<LENGTH;i++){ printf("%d ",a[i]); } printf("\n"); int b[LENGTH]; for(int i=0;i<LENGTH;i++){ printf("%d ",b[i]); } }
0 0 0 0 0 4200814 4200720 49 8 41 Process returned 0 (0x0) execution time : 0.739 s Press any key to continue.
從代碼結果可以清楚地看出來,全局數組與局部數組的默認值是不同的.
2.我們接下來再說局部數組為什麽是隨機的.局部數組是放在棧區的,而全局數組是放在靜態區的.
因為局部數組放在棧區,棧的操作就是入棧和出棧.我們聲明數組,其實只是移動棧頂指針.而棧內的數據是上一次出棧時候遺留的數據.棧不會清空.所以數據是隨機的.下面用一段代碼說明.
#include <stdio.h> void test(); int main() { test(); test(); } void test() { int a[5]; for(int i=0;i<5;i++){ printf("%d ",a[i]); } printf("\n"); for(int i=0;i<5;i++){ a[i] =i; } for(int i=0;i<5;i++){ printf("%d ",a[i]); } printf("\n"); }
//輸出結果 1944480698 1944480941 4200720 6356884 4200814 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
當我們連續兩次調用一個函數的時候.我們發現只有第一次的值似乎是隨機的.因為我們兩次相同的操作對棧的地址操作也是相同的.我們第一次函數對棧的修改並沒有被棧清空,所以第二次的隨機值就是第一次最後的數據了.
C語言的未初始化的數組的值為什麽是隨機的