1. 程式人生 > >C語言的未初始化的數組的值為什麽是隨機的

C語言的未初始化的數組的值為什麽是隨機的

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語言的未初始化的數組的值為什麽是隨機的