【问题标题】:Warning: Return from incompatible pointer type警告:从不兼容的指针类型返回
【发布时间】:2019-10-12 19:19:44
【问题描述】:

下面的代码产生编译器警告:从不兼容的指针类型返回。我返回的类型似乎是问题,但我似乎无法修复此警告。

我尝试将手的类型更改为 int *。也尝试过返回&hands。

int * dealDeck(int numPlayers, int numCards, int cardDeck[])
{
    static int hands[MAX_PLAYERS][MAX_CARDS]={0};

    int start = 0;
    int end = numCards;
    int player, hand, j;
    int card;

    for(player = 0; player < numPlayers; player++)
    {
        for(hand = start, j=0; hand < end; hand++,j++)
        {
            card =  cardDeck[hand];
            hands[player][j] = card;
        }
        start = end;
        end += numCards;
    }

    return hands;
}

这个函数应该返回一个指向数组“hands”的指针。然后将该数组传递给另一个函数,该函数将打印出它的元素。

【问题讨论】:

  • “手柄”是二维整数数组,每个玩家一个。 “dealDeck”表示它将返回一个单维整数数组。要么需要修改返回类型,要么只返回数组。
  • 您可能会发现将数组(在需要的地方定义)作为参数传递给函数更容易(也更传统),而不是让它无法访问。

标签: c


【解决方案1】:

hands 变量不是int * 这是int ** 所以你需要返回一个int **

这是一个二维数组。

【讨论】:

    【解决方案2】:

    首先,您声明了int * 的返回类型,这意味着您正在尝试返回一个数组,而您想要返回一个二维数组。正确的类型通常是int **,但这不会在这里剪掉它。您选择使用静态、固定大小的数组。这意味着,您需要返回指向某些大小为 MAX_CARDS * sizeof(int) 的结构的指针(以及正确的类型,这是真正的问题)。 AFAIK,没有办法在 C* 中指定返回类型。

    虽然有很多选择。如果您只指定最多 1 个大小(static int *hands[MAX_PLAYERS]static int **hands),则可以保留静态方法,但是您需要动态分配内部数组。

    执行此操作的明智方法通常是“通过引用调用”,您通常在调用函数之前定义数组并将其作为参数传递给函数。然后该函数直接修改外部变量。虽然它会极大地帮助您的代码的可维护性,但我惊讶地发现它并没有消除警告。这意味着,最好的解决方案可能是在调用函数之前动态分配数组,然后将其作为参数传递给函数,以便它可以访问它。这也解决了数组是否需要初始化的问题,以及= {0} 是否是易读的方式(对于多维数组),因为您必须“手动”初始化它。

    例子:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define PLAYERS 10
    #define DECKS   20
    
    void foo(int **bar)
    {
        bar[0][0] = 777;
        printf("%d", bar[0][0]);
        /*
         * no point in returning the array you were already given
         * but for the purposes of curiosity you could change the type from
         * void to int ** and "return bar;"
         */
    }
    
    int main()
    {
        int **arr;
    
        arr = malloc(sizeof(int *) * PLAYERS);
        for (size_t d = 0; d < DECKS; d++) {
            /* calloc() here if you need the zero initialization */
            arr[d] = malloc(sizeof(int) * DECKS);
        }
        foo(arr);
    
        return 0;
    }
    

    *一些编译器会调用 int (*)[20] 这样的类型,但这不是有效的 C 语法

    【讨论】:

      猜你喜欢
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多