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

C 語言指針數組調試:%s 與 %c 格式符的指針層級陷阱

     編輯:程式設計綜合問答

問題代碼

char *name[] = {"File","Edit","Write","Read","Exit"};
char **p = name;
for (int i=0; i<5; i++) {
    printf("%s\t", **p); // 錯誤:傳遞 char 給 %s
    p++;
}

運行無輸出或亂碼;改為 `printf("%s\t", *p);` 即正常。

記憶體模型圖解

name (char *[5]) → [0] → "File\0"
                    [1] → "Edit\0"
                    ...
p (char **) → 指向 name[0] 地址
*p  → char *  → 指向 "File\0" 首字符地址  ← %s 期望的類型
**p → char    → 'F'                        ← %c 期望的類型

核心規則

  • `%s` 期望參數類型 `char *`(字符串首地址),遇 `\0` 停止。
  • `%c` 期望參數類型 `char`(單個字符值),打印該字符。
  • `name`、`p`、`*p` 均為地址;`**p` 為具體字符值。

正確遍歷寫法

// 寫法 1:指針算術
for (char **p = name; p < name + 5; p++)
    printf("%s ", *p);

// 寫法 2:下標
for (int i = 0; i < 5; i++)
    printf("%s ", name[i]);

// 寫法 3:範圍 for (C++)
for (const char *s : name) cout << s << ' ';

調試技巧

編譯器啟用 `-Wformat`(GCC/Clang)或 `/W4`(MSVC)會報警:`format '%s' expects argument of type 'char *', but argument 2 has type 'int'`。善用編譯器警告,比運行時調試更高效。

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