我有以下結構和功能。分配二維陣列后,我想回傳它,但由于某種原因,我不斷收到錯誤訊息:“警告:從回傳型別不兼容的函式'Array *' {aka 'struct array *'} [ -Wincompatible-pointer-types]"
typedef struct array
{
int n1;
int n2;
int *data;
} Array;
Array *array_create(int n1, int n2)
{
int **arr = malloc(n1 * sizeof(int*));
for (int i = 0; i < n1; i )
{
arr[i] = malloc(n2*sizeof(int));
}
Array values = {n1, n2, *arr};
return values;
}
為了清楚起見,下面是 main 函式中的一些代碼:
{
Array *arr = array_create(4, 4);
int cnt = 1;
for (int i = 0; i < 4; i ) {
for (int j = 0; j < 4; j ) {
array_set(arr, i, j, cnt );
}
}
uj5u.com熱心網友回復:
我相信你想回傳一個指向你的結構的指標,所以你必須先 malloc 它:
const Array *values = malloc(sizeof(*values));
return values
如果你想讓你的 Array 是 const 你需要改變函式宣告:
const Array *array_create(int n1, int n2)
以及主函式中的變數宣告:
const Array *arr = array_create(4, 4);
uj5u.com熱心網友回復:
- 您不分配僅二維陣列的指標陣列。
- 使用正確的尺碼型別 (
size_t) - 您的指標型別錯誤。
我會采取不同的方式來避免復雜的 malloc 模式。
typedef struct array
{
size_t rows;
size_t cols;
int data[];
} Array;
Array *array_alloc(size_t rows, size_t cols)
{
Array *array = malloc(sizeof(*array) rows * cols * sizeof(array -> data[0]));
if(array)
{
array -> rows = rows;
array -> cols = cols;
}
return array;
}
#define ARR(var) ((int (*)[var -> cols])(var -> data))
int main(void)
{
Array *a = array_alloc(10,20);
for(size_t row = 0; row < 10; row )
{
for(size_t col = 0; col < 20; col )
{
ARR(a)[row][col] = row *1000 col;
}
}
for(size_t row = 0; row < 10; row )
{
for(size_t col = 0; col < 20; col )
{
printf("[]] ", ARR(a)[row][col]);
}
printf("\n");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/366237.html
上一篇:在c中創建一個strlen函式
