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

C 語言數組結束判斷:double 類型不能用 '\0' 比較,需用長度或哨兵值

     編輯:程式設計綜合問答

錯誤代碼


double x[10];
for (int i = 0; x[i] != '\0'; i++) { ... } // 錯誤:'\0' 是字符字面量 (int 值 0),double 比較語義錯誤

原因

  • `'\0'` 是 **字符類型** (整數常量 0),用於 **字符串 (char 數組)** 結束標記。
  • `double` 是 **浮點類型**,無「結束符」概念。`x[i] != 0.0` 僅判斷值是否為 0.0,**不代表數組結束** (數組中間可能有 0.0)。
  • C 語言數組**不攜帶長度信息**,運行時無法自動判斷邊界。

正確遍歷方式

1. 已知長度 (最常用)


int n = 10; // 或 sizeof(x)/sizeof(x[0]) 僅在定義作用域有效
for (int i = 0; i < n; i++) { ... }

2. 哨兵值 (特定業務約定)


// 約定 -1.0 為結束標記 (業務數據不含負數)
double x[] = {1.1, 2.2, 3.3, -1.0};
for (int i = 0; x[i] != -1.0; i++) { ... }

3. 結構體封裝長度 (工程化)


typedef struct {
    double *data;
    size_t len;
} DoubleArray;

DoubleArray arr = {malloc(100*sizeof(double)), 100};
for (size_t i = 0; i < arr.len; i++) { ... }

編譯器警告

現代編譯器 (GCC `-Wall`, Clang, MSVC `/W4`) 會警告:`comparison between double and character constant`,**務必開啟警告並視為錯誤處理**。

最佳實踐

  1. **傳遞長度參數** 或 **結構體封裝長度**,拒絕裸指針/數組跨函數傳遞。
  2. 字符串專用 `'\0'` 結束符,**切勿濫用於其他類型**。
  3. 使用 C++ `std::vector` / `std::array` 替代原始數組,自帶 `size()`、邊界檢查、RAII 管理。

理解「數組退化為指針丟失長度」是 C/C++ 內存安全的核心課題。

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