我正在尋找一種創建二維陣列并回傳它的有效方法,通常我創建一個指標陣列,為每個指標分配記憶體,然后回傳一個 **ptr。我一直在尋找另一種方法來做到這一點,因為那時我必須釋放分配的每一個記憶體。
我在網上讀到你可以像這樣分配一個二維陣列:int (*arr)[n] = malloc( sizeof *arr * i );
其中 ptr 是一個指標,指向arr[n].
當我嘗試從以下函式回傳 arr 時:int *array_of_smallest(int count);
我得到:warning: assignment to ‘int *’ from incompatible pointer type ‘int (*)[n]’ [-Wincompatible-pointer-types]
如果我初始化另一個指標并將其指向陣列,然后回傳它,我只回傳一個一維陣列。
我想我正在混合不同的概念并使自己感到困惑。
使用指標陣列我沒有問題,但我想要一種更簡單的方法來創建二維陣列,也更容易釋放,但我無法從我的函式中回傳該陣列。
uj5u.com熱心網友回復:
您宣告了變數修改型別 int ( * )[n] 的指標。
int (*arr)[n] = malloc( sizeof *arr * i );
那就是n宣告器中使用的變數不是整數常量運算式。
在這種情況下,函式應該有回傳型別void *。它可以宣告為
void * array_of_smallest(int count)
{
int (*arr)[n] = malloc( sizeof *arr * i );
//...
return arr;
}
在來電者中,您將寫
int ( *arr )[n] = array_of_smallest( count );
在此宣告中, 的值n必須與函式中使用的值相同。
如果使用整數常量運算式,例如
int (*arr)[2] = malloc( sizeof *arr * 2 );
那么函式宣告將如下所示
int ( * array_of_smallest(int count) )[2];
或者您可以在函式宣告之前引入 typedef 名稱,例如
typedef int Array[2];
在這種情況下,函式看起來像
Array * array_of_smallest(int count);
uj5u.com熱心網友回復:
回傳陣列的根本問題是不可能在檔案范圍內宣告可變修改型別(如指向 VLA 的指標)。
問題的原因可以解釋如下。您的代碼行為或多或少是這樣的:
typedef int T[n];
T* array_of_smallest(int count) { ... }
不幸的是,T由于兩個原因,無法定義這樣的型別:
n通常在檔案范圍內不可見,除非它是全域變數- 評估
n將需要在檔案范圍內執行代碼,這是被禁止的
解決方法
void*按照其他答案中的說明回傳。以“按參考”樣式傳遞指向 VLA 的指標,作為指向陣列的指標
void array_of_smallest(int count, int (**p)[n]) {
...
*p = arr;
}
- 回傳指向不完整陣列型別的指標
int[]。不可能回傳不完整型別,但可以回傳指向不完整型別的指標:
int (*array_of_smallest(int count))[] { ... }
或在擴展的幫助下更typeof簡潔(C23 中的功能)
typeof(int[]) *array_of_smallest(int count) { ... }
并在這種void*情況下使用它:
int ( *arr )[n] = array_of_smallest( count );
此解決方案提供元素型別的型別檢查,但它僅適用于二維陣列。
- 將指標包裝成一個結構并使用宏在客戶端重建其型別:
typedef struct {
int rows, cols;
void* data;
} Arr2D;
Arr2D array_of_smallest(int count) {
...
return (Arr2D) { .rows = i, .cols = n, .data = arr };
}
#define ARR2D_DEF_VIEW(view, arr2d) int (*view)[(arr2d).cols] = (arr2d).data
... usage ...
Arr2D arr = array_of_smallest(42);
ARR2D_DEF_VIEW(view, arr);
... do stuff with view[i][j]
}
或者,使用typeof擴展來推斷 VLA 視圖的型別,而不是在宏中宣告它:
#define ARR2D_VIEW_TYPE(arr2d) typeof(int(*)[(arr2d).cols])
...
Arr2D arr = array_of_smallest(42);
ARR2D_VIEW_TYPE(arr) view = arr.data;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/487154.html
下一篇:鏈表中的指標
