在 Java 等高級語言中,函數可直接返回數組對象。但在 C/C++ 中,數組不是一級類型,無法作為返回值類型。數組名在表達式中會退化為指向首元素的指針,且局部數組生命周期隨函數結束而終結。因此,必須通過「返回指針」或「封裝結構體」兩種曲線救國方案來實現。
聲明返回類型為「指向含 N 個元素數組的指針」,語法:int (*func())[10]。
malloc/calloc),否則返回棧地址導致未定義行為。free 釋放,否則內存洩漏。(*ptr)[i]。#include <stdio.h>
#include <stdlib.h>
int (*retArray())[10] {
int (*a)[10] = calloc(10, sizeof(int)); // 動態分配並歸零
for (int i = 0; i < 10; i++) (*a)[i] = i;
return a;
}
int main() {
int (*b)[10] = retArray();
printf("%d\n", (*b)[0]); // 輸出 0
free(b); // 必須釋放
return 0;
}
利用結構體可作為返回值的特性,將數組包裹在結構體內。
| 優點 | 缺點 |
|---|---|
| 語法簡潔,調用像普通變量 | 大數組會導致棧上拷貝開銷大 |
| 避免手動內存管理,無洩漏/懸空指針風險 | 不適合超大數據量場景 |
#include <stdio.h>
struct Tag { int a[10]; };
struct Tag retArray() {
struct Tag x;
for (int i = 0; i < 10; i++) x.a[i] = i;
return x; // 整個結構體拷貝返回
}
int main() {
struct Tag y = retArray();
printf("%d\n", y.a[3]); // 輸出 3
return 0;
}
malloc/free,且不返回局部變量地址。int (*a)[10] 不能直接賦值給 int b[10]。僅在函數參數傳遞時,數組退化為指針可視為等價。int (*)[3][4] 類似處理。std::array、std::vector 或 std::unique_ptr 管理動態數組,告別裸指針。C 語言返回數組本質是「返回指針」或「值拷貝結構體」。前者靈活高效但需嚴格管理內存;後者安全簡單但受限於棧拷貝開銷。根據數據規模、所有權模型、項目規範選擇方案,並在 C++ 項目中優先拥抱標準庫容器。