教材示範使用 char *name[] (指標陣列) 存儲不等長字串,並以指標交換方式排序,聲稱比二維陣列 char name[][MAX_LEN] 節省記憶體。初學者困惑:指標陣列在記憶體中不也是離散分佈,同樣有空洞嗎?
char name[5][25]; // 假設最長 25 字元
5 × 25 = 125 字節。\0,造成 內部碎片。char *name[] = {"Follow me", "Basic", "Great Wall", "FORTRAN", "Computer Design"};
5 × sizeof(char*) (32/64 位元下 20/40 字節)。提問者截圖顯示指標陣列「也有很多空值」,實際上那是 指標陣列元素之間的固定間距 (每個指標 4/8 字節),而非字串內部填充。這點開銷遠小於二維陣列的內部碎片。
交換指標僅需 3 次指標賦值 (O(1)),而二維陣列需 strcpy 逐字元搬移 (O(長度)),效率差異顯著。
若字串來源非編譯期常數 (如讀取檔案),需 malloc 配置每字串精確長度,再存指標,釋放時逐一 free。示例代碼已展示此模式。
指標陣列以 空間換時間:少量指標開銷換取無內部碎片與高效排序,是 C 語言處理不等長字串的經典慣用法。