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) | 是 |
| 空間效率 | 高(按實際長度) | 低(固定寬度) |
| 最大長度限制 | 無 | 受限於第二維 |
| 適用場景 | 只讀字典、命令列參數 | 需修改、長度均勻、嵌入式定長緩衝 |
兼得「可變長」與「可修改」:
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)