【问题标题】:Unable to return a type struct in C无法在 C 中返回类型结构
【发布时间】:2022-01-04 00:12:31
【问题描述】:

我有以下结构和功能。分配二维数组后,我想返回它,但由于某种原因,我不断收到错误消息:“警告:从返回类型不兼容的函数返回 'int **' '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++);
        }
    }

【问题讨论】:

  • 您声称array_create 将返回Array *。该函数最终返回return arr;。如果我们追溯arr 的定义位置,我们会找到int **arr。而int ** 不是Array *
  • @Cheatah 请原谅我,我一定是通过输入 return arr 而不是返回值写了一个错误。但是,尽管值是 Array 类型,但在返回它时我仍然遇到相同的错误。
  • @Adele 请发布正确的Minimal, Reproducible Example,详细说明您遇到问题的确切代码。

标签: c function multidimensional-array struct doubly-linked-list


【解决方案1】:
  1. 您没有分配仅二维数组的指针数组。
  2. 使用正确的尺寸类型 (size_t)
  3. 您的指针类型错误。

我会做不同的事情以避免复杂的 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("[%5d] ", ARR(a)[row][col]);
        }
        printf("\n");
    }
}

【讨论】:

    【解决方案2】:

    我相信你想返回一个指向你的结构的指针,所以你必须先 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);
    

    【讨论】:

    • 宁可Array *values = malloc(sizeof(*values));
    • 是否可以为类型结构分配二维数组?我认为您只能使用 int 类型的变量来做到这一点,似乎无法找到使用类型结构的方法。
    • @Adele 你可以简单地对结构做同样的事情,例如Array values[5][5]int values[5][5] 一样有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2013-03-21
    相关资源
    最近更新 更多