【问题标题】:function call and function prototype in c with a 2d array parameter带有二维数组参数的c中的函数调用和函数原型
【发布时间】:2013-02-12 10:20:48
【问题描述】:
void setup_map (int *map); <--- prototype

int row, col;  <-- global variables

some main 
{
  //get number of rows and cols from user
  int map[rows][cols]; //create map here because another function uses it
  setup_map (map[row][col]);
}

void setup_map (int map[row][col])
{
  loop through and set up map
}

我的问题是我无法完全正确地制作原型,我希望某个地方可以向我解释我的原型需要是什么?我刚刚开始学习指针并很好地理解了这个概念,只是从未使用过二维数组作为参数。感谢您的帮助。

【问题讨论】:

  • passing 2d arrays 的可能重复项
  • 传递二维数组的链接有一个真正帮助我的答案。事实证明,我需要使用 malloc 来动态分配我的数组并能够将其传递给函数。感谢大家的帮助!

标签: c arrays syntax function-prototypes


【解决方案1】:

正确的原型包括:

void setup_map(int map[ROWS][COLS]);
void setup_map(int map[][COLS]);
void setup_map(int (*map)[COLS]);

并称它为:

setup_map(map);

但请注意,行数和列数需要是编译时常量才能使其工作。

【讨论】:

  • +1 用于包含有效原型,但 OP 也需要调用语句。添加将完成您的答案
  • 那么有没有办法我仍然可以从用户那里获得行数和列数?创建一个指向二维数组的指针并传递指针?
  • @user2041767 你将不得不为此使用动态内存分配。
【解决方案2】:

有几处出错了。

首先错了,你以错误的方式调用你的函数。

你不应该调用setup_map (map[row][col]);,而应该调用setup_map (map);,因为数组名是一个指针,数组名加上[]操作符获取内存中特定位置的内容。

然后你需要让你的原型和你的定义看起来一样,因为编译器会使用原型(不是定义,如果是之后的)来解析你的代码是否正确,如果你的原型会得出错误的结论错了。

现在是原型本身:

如果你真的需要你的函数期望一个固定大小的数组,那么你必须使用编译时常量。

像这样:

void setup_map( int map[23][9]);

或者这个:

#define ROWS = 23;
#define COLS = 9;
void setup_map( int map[ROWS][COLS] );

请记住,数组的名称是一个指针。

【讨论】:

    【解决方案3】:

    举个例子

    #include <stdio.h>
    
    void print_matrix(int x, int y, int matrix[][x])
    {
        int i, j;
    
        for (i = 0; i < y; ++i) {
            for (j = 0; j < x; ++j) {
                printf("[%i]", matrix[i][j]);
            }
            putchar('\n');
        }
    }
    
    int main()
    {
        int matrix[][2] = {{0, 1}, {2, 3}};
        print_matrix(2, 2, matrix);
        return 0;
    }
    

    【讨论】:

      【解决方案4】:

      您必须在以您的方式清除数组时提供整数值。

      如:

      int map[5][10];
      

      如果您想将这些值作为 row 和 col 给出,首先您必须为 row 和 cols 定义宏。

      宏:

      #define ROW 5
      #define COL 10
      

      main() 中的声明:

      int map[ROW][COL];
      

      如果您打算从用户那里获取 row 和 col 值,事情可能会变得有点复杂,因为您必须使用 malloc() 和 free() 函数进行动态内存分配。

      int main()
      {
          int *map;
          int row, col;
      
          printf("enter row and col value:");
          scanf("%d %d", &row, &col);
      
          map = (int *) malloc(row * col * sizeof(int));
      
          //use the array
      
          free(map);
          return 0;
      }
      

      示例函数原型:

      void setMap(int *map, int row, int col);
      

      在执行函数时使用你的函数原型。只需添加大括号并开始填写。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-26
        • 2012-07-24
        • 1970-01-01
        • 2015-10-20
        • 2017-11-26
        相关资源
        最近更新 更多