return expression; // 返回表達式值 return; // void函數強制結束
return,但單次調用只執行一處| 函數聲明返回類型 | return表達式類型 | 行為 |
|---|---|---|
int | double | 隱式截斷轉換,可能觸發警告 |
double | int | 隱式擴展轉換 |
void | 任意 | 編譯錯誤(C99後允許return expr;但值被丟棄) |
| 指針類型 | 不同指針 | 需顯式強轉,否則警告 |
char *bad_func() {
char str[30] = "hello"; // 棧上分配
return str; // 錯誤:函數返回後棧幀銷毀,指針懸空
}
後果:未定義行為,可能輸出亂碼、崩潰或看似正常(棧內存未被覆蓋)。
| 策略 | 代碼模式 | 適用場景 | 注意事項 |
|---|---|---|---|
| 動態分配 | char *p = malloc(n); return p; | 可變長字符串、結構體 | 調用者必須free,文檔標註所有權轉移 |
| 靜態緩衝區 | static char buf[128]; return buf; | 簡單工具函數、單線程 | 非線程安全,後續調用覆蓋數據 |
| 調用者提供緩衝區 | void func(char *out, size_t sz); | 高性能、線程安全、無所有權糾葛 | 推薦API設計模式 |
| 返回結構體值 | struct Point {int x,y;}; return (Point){1,2}; | 小型POD類型(≤2-3機器字) | C99複合字面量,避免指針麻煩 |
void swap(int *a, int *b) {
if (a == b) return; // 早期退出,類比break
int t = *a; *a = *b; *b = t;
}
等價於到達函數末尾的大括號,用於守衛條件簡化嵌套。
return 0; / return EXIT_SUCCESS;:成功return 1; / return EXIT_FAILURE;:失敗main省略return隱含返回0$?獲取返回碼,構建腳本流程控制return結束_alloc/_newint,成功為0,失敗為負值/枚舉