首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言 static 變量何時賦值?編譯期還是運行期? C 語言 static 變量何時賦值?編譯期還是運行期?

     編輯:關於C

結論

靜態變量(static)在程序加載階段(運行前)完成初始化賦值,屬於靜態存儲期,編譯期確定初值,存放在 .data/.bss 段。

驗證實驗

// test_static.c
#include 

int main() {
    static int i;              // 未顯式初始化 → 默認 0,放 .bss
    static int j = 0x12345678; // 顯式初始化 → 放 .data
    printf("i=%08X, j=%08X\n", i, j);
    return 0;
}

編譯生成目標文件

gcc -c test_static.c -o test_static.o

查看符號表

objdump -t test_static.o

符號表輸出

圖 符號表顯示 i 在 .bss,j 在 .data

查看 .data 段內容

objdump -j .data -s test_static.o

data段內容

圖 .data 段中可見 0x78 0x56 0x34 0x12 (小端存儲 0x12345678)

內存佈局解析

關鍵區別:static vs 自動變量

  • 自動變量:棧上分配,函數調用時賦值,函數返回銷毀
  • static 變量:數據段分配,程序啟動前初始化,生命週期 = 進程生命週期

常用 objdump 命令速查

objdump -t file.o        # 符號表
objdump -h file.o        # 所有段概覽
objdump -j .text -S file.o  # 反彙編 .text 段
objdump -j .data -s file.o  # 十六進制顯示 .data 段

總結

static 變量初始化發生在程序加載階段(由加載器根據目標文件 .data/.bss 段完成),而非運行到聲明語句時。這保證了 static 變量在 main 執行前已具備確定值,也解釋了為什麼 static 局部變量能跨函數調用保持值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
變量類型存儲段初始化時機默認值
static 全局/局部(已初始化).data程序加載時從映像複製指定值
static 全局/局部(未初始化).bss加載時內核清零0
const static(僅讀).rodata加載時映射指定值