control may reach end of non-void function 意思是:函數宣告有回傳值(非 void),但存在某條執行路徑可能不執行任何 return 陳述式就結束函數,導致未定義行為。
int find(int num[]) {
for (int i = 1; i < 10; i++) {
if (num[i] != 0) {
return i;
break; // 無用代碼,return 後不可達
}
}
// 若迴圈結束皆為 0,或陣列長度不足,這裡無 return → 警告觸發
}
returnint num[] 退化為指標,函數內無法得知長度,硬編碼 10 極不安全num[0]int find(int num[], int n) { // 新增長度參數 n
for (int i = 0; i < n; i++) { // 從 0 開始
if (num[i] != 0) {
return i; // 找到立即回傳
}
}
return -1; // 關鍵:找不到時回傳標記值(如 -1)
}
int arr[] = {0, 0, 5, 0, 3};
int len = sizeof(arr) / sizeof(arr[0]);
int idx = find(arr, len);
if (idx != -1) {
printf("第一個非零元素索引:%d,值:%d\n", idx, arr[idx]);
} else {
printf("陣列全為零\n");
}
// 回傳 bool 表示是否找到,索引透過指標輸出
bool find_first_nonzero(const int arr[], size_t len, size_t* out_index) {
for (size_t i = 0; i < len; i++) {
if (arr[i] != 0) {
if (out_index) *out_index = i;
return true;
}
}
return false;
}
-Wall -Wextra -Werror=return-type(將此警告視為錯誤)/W4 /WX「control may reach end of non-void function」是編譯器發現的嚴重邏輯漏洞。修正原則:所有執行路徑必須有明確回傳。同時務必將陣列長度作為參數傳入,避免硬編碼魔術數字,索引從 0 開始。養成嚴謹的函數契約設計習慣,能消除大類未定義行為風險。