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

C 語言字串陣列兩種實作:指標陣列 vs 二維陣列

     編輯:關於C語言

前言

C 語言沒有內建字串類型,字串本質是「以 \0 結尾的 char 陣列」。要存放多條字串,常見兩種做法:指標陣列 與 二維陣列。兩者在記憶體佈局、可修改性、空間效率上差異極大,選型需視場景而定。

方法一:指標陣列 char *strs[]

char *test[] = { "this is a test", "test 2", "" };
// 記憶體圖解:
// test[0] ──► "this is a test\0"  (通常在唯讀區 .rodata)
// test[1] ──► "test 2\0"
// test[2] ──► "\0"
  • 優點:字串長度不一也無浪費;初始化簡潔。
  • 缺點:字串常駐唯讀區,不可修改內容(嘗試 test[0][0] = 'T' 會段錯)。
  • 變通:若需修改,可先建可寫陣列再取址:
    char buf1[] = "modifiable"; char *p = buf1;

方法二:二維陣列 char strs[][MAX_LEN]

char test[][20] = { "this is a test", "test 2", "" };
// 記憶體圖解(連續塊,每行固定 20 bytes):
// test[0] : 't','h','i','s',' ','i','s',' ','a',' ','t','e','s','t','\0', x5
// test[1] : 't','e','s','t',' ','2','\0', x13
// test[2] : '\0', x19
  • 優點:存放在棧/數據區,**內容可修改**;連續記憶體利於快取。
  • 缺點:空間浪費嚴重——短字串也佔滿固定寬度;MAX_LEN 需預估最大長度,過小截斷,過大浪費。

對比速查表

維度指標陣列二維陣列
記憶體佈局指標連續,字串分散完全連續
字串可修改否(字面量在 .rodata)是
空間效率高(按實際長度)低(固定寬度)
最大長度限制無受限於第二維
適用場景只讀字典、命令列參數需修改、長度均勻、嵌入式定長緩衝

進階:動態分配「指標陣列 + 獨立 malloc」

兼得「可變長」與「可修改」:

char **arr = malloc(n * sizeof(char*));
for (int i=0; i<n; ++i) {
    arr[i] = malloc(strlen(src[i]) + 1);
    strcpy(arr[i], src[i]);
}
// 用完逐個 free(arr[i]) 再 free(arr)

總結

  • **只讀、長度不一** → 指標陣列最划算。
  • **需寫入、長度相近** → 二維陣列最簡單。
  • **需寫入且長度差異大** → 動態分配指標陣列。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved