標籤:為我 二次 移動 初始 語言 res define 沒有初始化 操作
突然想起來前幾天同學問我為什麼沒有初始化的數組的值是隨機的,發現這個困惑自己也是存在的,所以自己總結的心得.
1. 首先,並不是所有未初始化的數組的值都是隨機的.對於沒有初始化的數組,分兩種情況:
(1)全域數組,也就是定義在main函數外面的數組,元素的預設值是全部為0的
(2)局部數組,定義在函數內部的數組,其值預設是隨機的.
#include <stdio.h>#define LENGTH 5int 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 04200814 4200720 49 8 41Process returned 0 (0x0) execution time : 0.739 sPress 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 42008140 1 2 3 40 1 2 3 40 1 2 3 4
當我們連續兩次調用一個函數的時候.我們發現只有第一次的值似乎是隨機的.因為我們兩次相同的操作對棧的地址操作也是相同的.我們第一次函數對棧的修改並沒有被棧清空,所以第二次的隨機值就是第一次最後的資料了.
C語言的未初始化的數組的值為什麼是隨機的