在值返回函式中缺少 return 語句

int foo(void) {
  /* do stuff */
  /* no return here */
}

int main(void) {
  /* Trying to use the (not) returned value causes UB */
  int value = foo();
  return 0;
}

當宣告一個函式返回一個值時,它必須在每個可能的程式碼路徑上執行它。一旦呼叫者(期望返回值)嘗試使用返回值 1 ,就會發生未定義的行為。

請注意,僅當呼叫者嘗試使用/訪問函式中的值時,才會發生未定義的行為。例如,

int foo(void) {
  /* do stuff */
  /* no return here */
}

int main(void) {
  /* The value (not) returned from foo() is unused. So, this program
   * doesn't cause *undefined behaviour*. */
  foo();
  return 0;
}

Version >= C99

main() 函式是此規則的一個例外,因為它可以在沒有 return 語句的情況下終止,因為假設的 0 返回值將在這種情況下自動使用 2

1ISO / IEC 9899:201x ,6.9.1 / 12)

如果到達終止函式的},並且呼叫者使用函式呼叫的值,則行為是未定義的。

2ISO / IEC 9899:201x ,5.1.2.2.3 / 1)

到達終止 main 函式的}返回值 0。