C 全域性變數記憶體分配和初始化順序

2021-09-14 08:33:56 字數 406 閱讀 9850

區域性變數是在棧空間上,記憶體分配的順序和**的順序是一致的

一般來說,對於初始化的全域性變數,編譯器遇到之後知道這是乙個定義,會馬上分配空間,例如:

int ib = 10;

int ia = 10;

這個分配的結果是:ia的位址在ib後面

對於未初始化的全域性變數,編譯器遇到之後不知道是宣告還是定義,所以要在掃瞄完所有**之後才能決定,這個時候編譯器會讀符號表,然後看哪些變數沒有分配空間,因為符號表是字母順序的,所以這些變數的記憶體分配也是按照字母順序來的,例如:

int ib;

int ia;

這個分配的結果是:ia的位址在ib前面

對於全域性變數而言,除了在同乙個檔案定義的全域性物件的初始化,是按照定義次序來進行的之外,其他全域性或靜態變數之間的初始化次序沒有任何保障的。

未初始化全域性變數

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

C 全域性變數和static變數初始化問題

全域性變數 檔案域中的靜態變數 類中的成員靜態變數在main函式執行前初始化 區域性變數中的靜態變數在第一次呼叫時初始化。c和c 的區別 區域性靜態變數 在c語言中是編譯期初始化並分配記憶體,故不能用變數給靜態區域性變數賦值,只能用常量。在c 中是第一次執行時初始化,因為c 引入了物件的概念,物件一...

全域性變數與構造器初始化順序

1.先初始化全域性變數,再初始化構造器 2.先初始化父類,再初始化子類 3.先初始化靜態變數,再初始化其他變數 4.靜態變數第一次呼叫時初始化,只初始化一次 package com.yjq.cn.initialize public class orderofinitial class one pub...