本文匯總四個高頻踩坑點,每個都能單獨寫成一篇「避坑指南」,建議收藏備查。
time_t biggest = 0x7fffffff; // 32位系統 time_t 最大值
printf("biggest = %s", ctime(&biggest)); // 輸出自帶換行
關鍵發現: ctime() 返回的字符串末尾自帶 \n,所以 printf 不加 \n 也會換行。驗證代碼:
char *test = ctime(&biggest);
while (*test++) {
if (*test == '\n') printf("find '\\n' in test\n");
}
正確做法: 跨平台建議用 asctime(gmtime(&biggest)) 避免時區偏差。
char *a = "abc";
printf("strlen = %d\n", strlen(a)); // 輸出 3
malloc(strlen(a)); // ❌ 錯誤:只分配 3 字節,無 '\0' 空間
malloc(strlen(a) + 1); // ✅ 正確:包含結束符
這是緩衝區溢出的溫床,字符串操作永遠記住 +1 鐵律。
switch(b) {
case 0: ... break;
case 1: ... break;
default: printf("default\n"); break; // 放在中間完全合法
case 2:
while (b == 2) { printf("b=1\n"); break; } // break 只跳出 while
printf("after break, run here!\n"); // 繼續執行
break;
}
規則: default 只是「無 case 匹配時的入口」,位置不影響語義。但慣例放最後提高可讀性。
注意: break 只跳出最近一層循環或 switch,內層 break 不會跳出外層 switch。
const int c = 2; // case c: ... // ❌ 編譯錯誤:c 不是編譯期常量表達式
C 語言中 const int 只是「只讀變量」,非常量表達式,不能用於 case、數組長度、枚舉值 等需編譯期確定的場景。

ctime 自帶換行,跨平台用 gmtime+asctimemalloc(strlen+1) 是寫字符串的肌肉記憶default 位置隨意,break 只跳最近一層const ≠ 常量表達式,switch 別用它做 case