想透過函數返回一個二維陣列,但編譯總是報錯或執行結果不符預期。許多初學者嘗試直接返回陣列指標,卻忽略了棧記憶體生命週期與指標類型相容性問題。
float* q[3]; // 全域指標陣列
float* TIME(float E[3][2]) {
float F[3][2]; // 區域變數,函數結束即銷毀
// ...
for (int i = 0; i <= 2; i++) q[i] = F[i];
return *q; // 返回懸空指標,未定義行為
}
核心錯誤: 區域陣列 F 存放在棧上,函數返回後記憶體被釋放,指標指向無效區域。
#include <stdio.h>
int i, j;
float F[3][2]; // 靜態儲存期,生命週期贯穿整個程式
// 返回指向「含 2 個 float 的陣列」的指標
float (*TIME(float E[3][2]))[2] {
for (i = 0; i <= 2; i++)
for (j = 0; j <= 1; j++)
F[i][j] = 2 * E[i][j];
return F;
}
int main() {
float f[3][2], A[3][2];
float (*q)[2]; // 指向「含 2 個 float 陣列」的指標
// 初始化測試資料
for (i = 0; i <= 2; i++)
for (j = 0; j <= 1; j++) {
f[i][j] = j + i;
printf("%f\n", f[i][j]);
}
q = TIME(f); // 接收返回的指標
// 輸出結果驗證
for (i = 0; i <= 2; i++)
for (j = 0; j <= 1; j++) {
A[i][j] = *(*(q + i) + j); // 正確解引用
printf("%f\n", A[i][j]);
}
return 0;
}
| 宣告方式 | 含義 | 適用場景 |
|---|---|---|
float (*func())[2] | 返回指向「2 元素 float 陣列」的指標 | 固定列數的二維陣列 |
float** func() | 返回二級指標 | 動態分配、列數不固定 |
void func(float (*out)[2]) | 透過輸出參數填充 | 呼叫端負責記憶體,最安全 |
若陣列大小執行期才能決定,推薦使用 malloc/free:
float** create_matrix(int rows, int cols) {
float** m = malloc(rows * sizeof(float*));
for (int i = 0; i < rows; i++)
m[i] = malloc(cols * sizeof(float));
return m;
}
// 使用後必須逐行 free,再 free 指標陣列