關於未初始化全域性變數

2021-06-28 23:57:35 字數 1075 閱讀 8661

前幾天發現未初始化全域性變數一些特性,後來在一篇部落格上發現有人說過這個問題

這是原博文位址 blog.csdn.net/liuqiaoyu080512/article/details/8455652

然後結合原博文,自己又做了幾個實驗

以下算是自己實驗一遍以後的總結:

首先,自己曾經以為未初化的全域性變數也要在程式(不是正在執行的程序)中占有空間,但是後來發現這是錯的. 未初始化的全域性變數獲得相應大小的空間應該是在作業系統建立程序的時候分配(且是分配heap堆內的空間,不是data資料段), 和指標的初始化需要手動完成相比,這是自動的.(還有就是部分初始化和初始化的效果是一樣的)

int kross[1024*1024]=;

int main()

這樣編譯完以後的結果:

我們發現test(編譯完以後的out檔案)的檔案大小是包含部分初始化全域性變數的

當我們不初始化時

int kross[1024*1024];

int main()

結果是:

以上說明編譯器在編譯的時候會根據全域性變數是否初始化而做出儲存空間優化

2,未初始化全域性變數的空間分配會自動完成

先執行test檔案,然後ps -a找到test的pid,再根據pid檢視程序的詳細狀態:

從圖中可以發現vmdata的大小是包含變數的大小的

相反當我們將變數改為指標時,這個時候vmdata的大小就變小了,作業系統沒有自動分配

還有就是原博文說初始化了的變數在建立程序時vmdata的大小也不大,主要是由於作業系統不是將乙個程式完全載入到記憶體

未初始化全域性變數

未初始化全域性變數,這名字就很直白,就是 c 程式中定義成全域性作用域而又沒有初始化的變數,我們知道這種變數在程式執行後是被自動初始化為 全0 的。編譯器編譯的時候會將這類變數收集起來集中放置到 bss 段中,這個段只記錄了段長,沒有實際上的內容 全是0,沒必要儲存 在程式被裝載時作業系統會為它分配...

C語言全域性變數的初始化

本意是想定義乙個全域性結構體變數,並設定其成變數的值。typedef struct a t a t a a.a 1 error expected asm or attribute before token a.b 2 error expected asm or attribute before to...

區域性變數和全域性變數的初始化

寫 的時候遇到了這個問題,選兩段抄過來做個筆記。定義區域性變數,其實就是在棧中通過移動棧指標來給程式提供乙個記憶體空間和這個區域性變數名繫結。因為這段記憶體空間在棧上,而棧記憶體是反覆使用的 髒的,上次用完沒清零的 所以說使用棧來實現的區域性變數定義時如果不顯式初始化,值就是髒的。在c語言裡,全域性...