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


突然想起來前幾天同學問我為什么沒有初始化的數組的值是隨機的,發現這個困惑自己也是存在的,所以自己總結的心得.

 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

  當我們連續兩次調用一個函數的時候.我們發現只有第一次的值似乎是隨機的.因為我們兩次相同的操作對棧的地址操作也是相同的.我們第一次函數對棧的修改並沒有被棧清空,所以第二次的隨機值就是第一次最后的數據了.

3.第二次更新,今天又想到了一個騷操作來證明.用的是c++.但是道理都是想通的.

因為重復運行這個代碼局部數組的地址總是不變的,我的是0x6afed0. 可以通過

printf("%x",a);   //a為數組名

來獲得數組名,用c++的地址轉換將數組首地址賦值給指針sp,然后通過sp操作改變數組第一位的值.以此來解釋未初始化的數組的值隨機的來源.我們從最終結果可以看出來.內存空間中這個地址當時的值是什么.因為未初始化,所以顯示的值就是什么.

#include <stdio.h>
#include <iostream>

void test();
int main()
{
    int* sp=reinterpret_cast<int *>(0x6afed0);
    *sp = 168;
    test();
    *sp = 113;
    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");
}

//輸出結果
168 7012032 7012088 7012300 1981401632
0 1 2 3 4
113 1 2 3 4
0 1 2 3 4

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM