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

C語言核心細節四連發:time_t極值、strlen陷阱、malloc字符串分配、switch中default位置

     編輯:關於C語言

C語言核心細節四連發:time_t極值、strlen陷阱、malloc字符串分配、switch中default位置

本文匯總四個高頻踩坑點,每個都能單獨寫成一篇「避坑指南」,建議收藏備查。

1. time_t 最大值測試與 ctime 隱藏換行符

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)) 避免時區偏差。

2. strlen 不包含 '\0' → malloc 必須 +1

char *a = "abc";
printf("strlen = %d\n", strlen(a));  // 輸出 3
malloc(strlen(a));      // ❌ 錯誤:只分配 3 字節,無 '\0' 空間
malloc(strlen(a) + 1);  // ✅ 正確:包含結束符

這是緩衝區溢出的溫床,字符串操作永遠記住 +1 鐵律。

3. switch 中 default 可以放在任意位置

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。

4. const 修飾變量在 switch 中不能作 case 標簽

const int c = 2;
// case c: ...  // ❌ 編譯錯誤:c 不是編譯期常量表達式

C 語言中 const int 只是「只讀變量」,非常量表達式,不能用於 case、數組長度、枚舉值 等需編譯期確定的場景。

運行輸出

程序輸出截圖

一句話總結

  • ctime 自帶換行,跨平台用 gmtime+asctime
  • malloc(strlen+1) 是寫字符串的肌肉記憶
  • default 位置隨意,break 只跳最近一層
  • const ≠ 常量表達式,switch 別用它做 case
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved