【问题标题】:Warning while passing 2d array传递二维数组时发出警告
【发布时间】:2009-05-08 00:52:27
【问题描述】:

我有以下功能

void initBoard(int * board[BOARD_ROWS][BOARD_COLS]){
  int z = 0;
  for( z = 0; z<10; z+=1){
     int l;
     for( l = 0; l<10; l+=1){
        board[z][l] = 0;
     }
  }
}

从 main 我称之为

  int plBoard[10][10];
  initBoard(&pcBoard);

编译时它可以工作,但我收到一条警告:警告:从不兼容的指针类型传递“initBoard”的参数 1。 array 是一个整数,并且函数需要一个 int 指针,我正在传递 int 的地址。它有什么问题?

【问题讨论】:

    标签: c arrays pointers


    【解决方案1】:

    除了您的问题中明显的拼写错误(plBoard 的定义但使用了pcBoard),您不需要使用地址运算符 (&amp;) 传递数组,因为它们'自动重新转换为地址。

    但是你incompatible type的问题是由于使用了:

    int * board[BOARD_COLS][BOARD_ROWS]
    

    这实际上是int 的二维数组指针(技术上是指向int 的指针数组),而不是您期望的整数。

    你应该使用:

    void initBoard(int board[BOARD_COLS][BOARD_ROWS]) {  // <-- remove "*"
    : : :
    }
    int plBoard[10][10];
    initBoard(plBoard);                                  // <-- remove "&"
    

    【讨论】:

      【解决方案2】:

      我不完全确定,但我相信这是因为:

      initBoard 需要一个指向整数的指针的数组。

      然而,plBoard 是一个 指针,指向 integers

      数组的数组

      【讨论】:

      • 我喜欢这样做:void initBoard(int board[/*BOARD_ROWS*/][BOARD_COLS]);以避免混淆。显示期望的大小,但也显示不能在其上使用 sizeof(因为它在参数列表中实际上是指针而不是数组。
      • 我认为正确的参数是:int (* board) [BOARD_ROWS][BOARD_COLS]
      【解决方案3】:

      从技术上讲,您将指针的内存地址发送到 initBoard()。当您声明一个数组(在本例中为 plBoard)时,它指向一个内存地址,其中连续内存保存您的数据项......所以说这个是多余的......

      int plBoard[10][10];  initBoard(&pcBoard);
      

      Pax 有你的答案,我只是想澄清一下,因为你还没有将它标记为答案。

      【讨论】:

        【解决方案4】:

        只是在同一页上..我完全同意 Pax ..

        块引用 int pcBoard[10][10]; 块引用 initBoard(&pcBoard);

        现在假设 pcBoard[0][0] 指向第 101 个位置(32 位地址)等等。 您所传递的意思是 &pcBoard 是 pcBoard[0][0] 的 32 位地址。 所以当函数

        Blockquote void initBoard(int * board[BOARD_ROWS][BOARD_COLS]){

        使用它..它显示一个错误,说它需要一个二维数组,而它在一个 32 位地址中得到什么,即 4 个字节(int)。

        提示一下,通过时不需要同时指定board[BOARD_ROWS][BOARD_COLS]。可以方便地去掉BOARD_ROWS,只指定BOARD_COLS。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-02
          • 1970-01-01
          • 2013-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多