字串是以 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 位元組)操作,回傳區塊數而非位元組數。