// 編譯錯誤:函數返回類型不能是陣列
typedef float Matrix44f[16];
Matrix44f translate(float x, float y, float z); // error: function returning an array
C 標準規定:函數返回類型不能是陣列或函數 (可返回結構體、指標、基本型別)。
float* translate(float x, float y, float z) {
static float m[16] = {0}; // 靜態儲存期,線程不安全
m[3] = x; m[7] = y; m[11] = z; m[15] = 1.0f;
return m;
}
// 呼叫端:float *mat = translate(1,2,3);
void translate(float *out, float x, float y, float z) {
for (int i=0;i<16;++i) out[i]=0;
out[3]=x; out[7]=y; out[11]=z; out[15]=1.0f;
}
// 呼叫端:float mat[16]; translate(mat, 1,2,3);
typedef struct { float m[16]; } Matrix44f;
Matrix44f translate(float x, float y, float z) {
Matrix44f r = {0};
r.m[3]=x; r.m[7]=y; r.m[11]=z; r.m[15]=1.0f;
return r; // 結構體可按值返回 (複製 64 字節)
}
float* translate(float x, float y, float z) {
float *m = malloc(16 * sizeof(float));
if (m) { memset(m,0,64); m[3]=x; m[7]=y; m[11]=z; m[15]=1.0f; }
return m;
}
| 方案 | 線程安全 | 記憶體管理 | 效能 | 推薦場景 |
|---|---|---|---|---|
| 靜態緩衝區 | 否 | 無需 free | 最快 | 單執行緒、臨時計算 |
| 呼叫端緩衝區 | 是 | 呼叫端控制 | 快 (無分配) | 高效能、庫函數介面 |
| 結構體返回 | 是 | 值語意 (棧上) | 中 (複製開銷) | 現代 C API、小型矩陣 |
| 動態分配 | 是 | 呼叫端 free | 較慢 (malloc) | 大小不定、生命週期長 |
表達式中陣列名 (除 `sizeof`、`&`、`_Alignof`) 隱性轉換為指向首元素的指標。因此:
void foo(int arr[10]); // 等價於 void foo(int *arr);
int a[10];
foo(a); // 傳遞 &a[0],大小資訊丟失
這也是為何函數參數無法直接接收陣列大小資訊的原因。