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

C 語言變量初始化與賦值(九):存儲類別差異、數組初始化規則、指針數組初始化

     編輯:關於C語言

前言

變量初始化看似簡單,實則暗藏存儲類別、作用域、生命週期、數組維度等多重規則。本文系統梳理**外部/靜態 vs 自動/寄存器**初始化語義差異、單個/數組/多維/指針數組初始化語法規則,並給出常見誤區修正表。

一、初始化時機與默認值:存儲類別決定一切

存儲類別初始化時機無顯式初始化時默認值初始化表達式限制
外部 (external)程序啟動前 (載入階段)0 (全零位模式)**常量表達式** (編譯期可計算)
靜態全局 (static 外部)程序啟動前0常量表達式
靜態局部 (static 內部)**首次進入** 定義所在函數/複合語句時0常量表達式
自動 (auto 局部)**每次進入** 定義所在函數/塊時**不確定 (垃圾值)****任意表達式** (可含變量、函數調用)
寄存器 (register)每次進入函數時不確定任意表達式

二、單個變量初始化實例

float f0, f1 = 0.2;        /* 外部:f0=0.0, f1=0.2 */

main() {
    static int i = 10, j;  /* 靜態局部:i=10, j=0 (僅首次執行賦值) */
    int k = i * 5;         /* 自動局部:每次進入 main 計算 i*5=50 */
    char c = 'y';          /* 字符初始化 */
    /* ... */
}

關鍵:static 局部變量**初始化只執行一次** (程序啟動或首次進入),後續調用保持上次值;auto 每次進入重新初始化。

三、數組初始化完整規則

1. 語法結構

  • 每行/每維用 { } 包裹,元素間 , 分隔,整體外層再加 { },以 ; 結束。

2. 存儲順序:行優先 (最右下標變化最快)

int p[2][3] = {{2, -9, 0}, {8, 2, -5}};
/* 記憶體順序:p[0][0], p[0][1], p[0][2], p[1][0], p[1][1], p[1][2] */

3. 多維可用一維語法初始化 (利用連續存儲)

int x[2][3] = {1, 2, 3, 4, 5, 6};  /* 等價於上述分組寫法 */

4. 初始化項少於元素數:剩餘自動補 0

int a[5] = {1, 2};  /* 等價 {1,2,0,0,0} */
int b[2][2] = {{1}, {2}};  /* 等價 {{1,0},{2,0}} */

5. 指針數組初始化:可省略長度,從 0 開始連續賦值

char *f[] = {'a', 'b', 'c'};
/* 編譯器推導長度 3,等價於:
   f[0]="a", f[1]="b", f[2]="c" (實際為字符串字面量地址) */

/* 更實用的字符串指針數組 */
char *msg[] = {"Error", "Warning", "Info"};
/* msg[0] 指向 "Error" 首字符地址,以此類推 */

四、字符串 vs 字符數組初始化區別

寫法類型大小可修改性存儲區
char s[] = "abc";char[4]4 (含 \0)**可修改**棧/數據段
char *p = "abc";char*指針大小**不可修改** (指向常量區)只讀數據段

五、常見誤區與修正

誤區代碼問題修正
int a[3] = {1,2,3,4};初始化項超過數組長度增加長度或減少項
int a[] = {1,2}; a[2]=3;長度固定為 2,越界寫入預留足夠長度 int a[5]={1,2};
static int *p = malloc(4);靜態變量初始化器必須為常量表達式運行時賦值:static int *p; p=malloc(4);
char s[4] = "abcd";缺少結束 \0,實際需 5 字節char s[5] = "abcd"; 或 char s[] = "abcd";
int *p = {1,2,3};指針無法用列表初始化分配記憶體後逐元素賦值

六、最佳實踐清單

  1. **總是顯式初始化**局部變量 (避免垃圾值 Bug)。
  2. 外部/靜態變量利用**零初始化語義**,大陣列無需手動清零。
  3. 數組初始化**優先用嵌套大括號**對應維度,可讀性最強。
  4. 字符串字面量**只讀**,需修改請用字符數組 char s[] = "..."。
  5. 指針數組存儲字符串時,元素類型為 const char* 更安全。

總結

初始化 = **存儲類別 + 作用域 + 語法規則** 的三重奏。外部/靜態「編譯期常量、零默認、一次初始化」;自動/寄存器「運行期任意表達式、垃圾默認、每次初始化」。數組按行優先展開、不足補零、指針數組退化為字符串指針陣列。精通此節,消滅「未初始化變量」這類最隱蔽、最難復現的經典 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved