首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言函數不能直接返回陣列:原因與替代方案

     編輯:關於C語言

錯誤示範


// 編譯錯誤:函數返回類型不能是陣列
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);

方案三:封裝於結構體 (C99 設計模式)


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 字節)
}

方案四:動態分配 (呼叫端負責 free)


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],大小資訊丟失

這也是為何函數參數無法直接接收陣列大小資訊的原因。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved