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

C語言進階:字串在記憶體中的儲存模型完整解析

     編輯:關於C

字串基本定義

字串是以 ASCII NUL('\0')結尾的字元序列。儲存於陣列或堆記憶體。並非所有字元陣列都是字串(可能無結尾 NUL),字元陣列也可儲存小整數/布林值以省空間。

  • 單位元組字串: char 型別
  • 寬字串: wchar_t(16/32 位元),用於非拉丁字元集

長度 = 不含 NUL 的字元數。分配記憶體時須包含 NUL 空間。NULL(指標)≠ NUL(字元),不可混用。

字元常數與字串字面值

字元常數用單引號('A'),C 語言型別為 int(通常 4 位元組),sizeof('A') == 4。字串字面值用雙引號("Sound"),存放於字面值池(通常唯讀區),程式中多次出現同一字面值通常僅存一份副本以節省空間。

三種字串宣告方式

方式語法特性
字面值char *p = "Sound";指向唯讀區,嘗試修改導致未定義行為(GCC 允許但危險)
字元陣列char buf[32];棟疊/靜態儲存,可修改,大小固定
字元指標char *p;需手動分配記憶體(malloc),靈活但易出錯

字串字面值池與 const 保護

字面值通常位於唯讀區,修改會崩潰(Segmentation Fault)。應宣告為 const char *p = "Sound";,編譯期即可捕捉修改嘗試。GCC 允許修改字面值屬擴展行為,不可依賴。

字串初始化

字元陣列初始化

char header[] = "Media Player";  // 自動計算大小含 NUL,編譯器複製內容
// 等價於
char header[13] = {'M','e','d','i','a',' ','P','l','a','y','e','r','\0'};

或用 strcpy(header, "Media Player");。

字元指標初始化(動態分配)

char *header = malloc(strlen("Media Player") + 1);  // 必須用 strlen,不可用 sizeof
strcpy(header, "Media Player");

sizeof 回傳指標/陣列大小而非字串長度,切勿用於計算字串分配大小。

關鍵函式行為細節

  • fgets(buf, size, fp):讀完一行(含 '\n')停止,buf[strlen(buf)-1] == '\n'。
  • fputs 不自動加換行,puts 會。
  • fread/fwrite 以區塊(size * nmemb 位元組)操作,回傳區塊數而非位元組數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved