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

C 語言變量初始化完全指南:標量、數組、結構體、指針、靜態存儲期規則

     編輯:關於C語言

C 語言初始化規則看似繁瑣,實則邏輯自洽。本文系統梳理標量、數組(含多維/字符)、結構體、指針、靜態存儲期變量的初始化語法與陷阱。

一、 標量類型

int a = 12;
char c = 'a';
float f = 12.3f;
double d = 1.23;
_Bool flag = 1; // C99

二、 數組初始化

1. 字符數組/字符串

char s1[] = "hello";           // 推薦:自動含 \0,長度 6
char s2[10] = "hello";         // 剩餘補 \0
char *p = "hello";             // 指向字符串常量區,不可修改
char s3[] = {'h','e','l','l','o','\0'}; // 繁瑣不推薦

2. 非字符數組

int a1[] = {1,2,3,4,5};        // 長度推導為 5
int a2[5] = {1};               // 首元素 1,其餘 0
int a3[5] = {[2] = 10};        // C99 指定初始化器,a3[2]=10,其餘 0

3. 多維數組

int m1[2][3] = {{1,2,3},{4,5,6}}; // 完整
int m2[][3] = {{1,2,3},{4,5,6}};  // 第一維可省略
int m3[2][3] = {1,2,3,4,5,6};     // 扁平化按行主序填充
int *rows[3];                     // 指針數組(鋸齒數組),需 malloc 每行

三、 結構體初始化

typedef struct { int id; int age; char *name; } Person;

// C99 指定初始化器(推薦,順序無關、可選字段)
Person p1 = { .id = 1, .age = 20, .name = "Tom" };

// 傳統順序初始化
Person p2 = { 2, 25, "Jerry" };

// 指針動態分配
Person *p3 = malloc(sizeof(Person));
if (p3) { p3->id = 3; p3->age = 30; p3->name = strdup("Bob"); }

// 複合字面量(C99,臨時對象)
Person p4 = (Person){ .id = 4, .name = "Alice" };

四、 靜態存儲期變量初始化規則

  • 全局/靜態變量**未顯式初始化** → 自動零初始化(整數 0、浮點 0.0、指針 NULL)。
  • 顯式初始化必須為**常量表達式**(編譯期可確定),不能調用函數。
  • 局部自動變量**無默認初始化**,值不確定,必須顯式賦值。

五、 避坑清單

  • 字符指針 vs 字符數組:char *p = "lit" 指向只讀區,char a[] = "lit" 在棧上可修改。
  • 結構體指針未 malloc 直接解引用 → Segfault。
  • 柔性數組成員(C99):struct { int len; char data[]; } 需 malloc(sizeof(Struct) + len)。
  • 變長數組(VLA,C99):int n; scanf("%d",&n); int a[n]; 僅限塊作用域,不能初始化。

六、 總結

C 初始化核心原則:**顯式優於隱式、編譯期優於運行期、指定初始化器優於順序**。掌握存儲期與初始化規則的交互,能消除 80% 的未定義行為 Bug。

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