首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言字串指標陣列排序:為何指標法比二維陣列更節省記憶體?

     編輯:程式設計綜合問答

問題核心

教材示範使用 char *name[] (指標陣列) 存儲不等長字串,並以指標交換方式排序,聲稱比二維陣列 char name[][MAX_LEN] 節省記憶體。初學者困惑:指標陣列在記憶體中不也是離散分佈,同樣有空洞嗎?

記憶體佈局對比

二維字元陣列

char name[5][25]; // 假設最長 25 字元
  • 連續配置 5 × 25 = 125 字節。
  • 短字串 (如 "Basic" 5 字節) 後填充 20 字節 \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 語言處理不等長字串的經典慣用法。

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