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

C語言字符常量 'C' vs 字符串常量 "C":類型、大小、內存佈局、隱含結束符

     編輯:C 語言問答

核心差異表

特性'C' (字符常量)"C" (字符串常量)
類型int (C89/C99) / char (C++)const char[2] (退化為 const char*)
大小sizeof('C') == sizeof(int) (通常 4)sizeof("C") == 2 (含隱含 \0)
值ASCII 碼 67 (可參與算術運算)地址 (指向只讀內存區 {'C', '\0'})
內存佈局立即數,編譯期常量,不佔運行時數據段只讀數據段 .rodata,地址固定,不可修改
修改後果不適用 (非左值)**未定義行為** (段錯誤/沉默破壞)

隱含結束符 \0 詳解


"C"  實際內存:  0x43 0x00  ('C' + '\0')
"AB" 實際內存:  0x41 0x42 0x00
""   實際內存:  0x00  (空字符串也佔 1 字節)

標準庫函數 (strlen, strcpy, printf("%s"), strcat) **全部依賴 \0 判斷結尾**。

經典陷阱


// 陷阱 1: 字符串字面量去修改
char *p = "hello";
p[0] = 'H';  // UB! 段錯誤 (只讀內存)
// 正確
char arr[] = "hello";  // 棧上複製一份
arr[0] = 'H';          // OK

// 陷阱 2: sizeof 混淆
char *p = "hello";
sizeof(p);   // 8 (指針大小, 64位)
sizeof("hello"); // 6 (含 \0)

// 陷阱 3: 字符 vs 字符串作函數參數
void foo(int c) { printf("%c\n", c); }
void bar(const char* s) { printf("%s\n", s); }
foo('A');   // OK, 印 'A'
foo("A");   // 警告: 指釖轉換為整數, 印亂碼
bar('A');   // 警告: 整數轉換為指釖, 崩潰
bar("A");   // OK, 印 "A"

最佳實踐

  • 單字符用 'c',字符串用 "str",嚴禁混用;
  • 字符串字面量賦值給 const char*,需要修改用數組 char buf[] = "...";
  • 啟用 -Wwrite-strings (GCC/Clang) 將字符串字面量類型視為 const char*,編譯期捕獲修改企圖;
  • 跨平台注意:Windows API 多用 TCHAR/LPCTSTR,實際映射 char/wchar_t,配合 _T("str") 宏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved