C - 使用2d数组作为参数

时间:2016-08-22 19:26:51

标签: c arrays gcc compilation compound-literals

我写了一个小小的c程序。代码由GCC 4.8.5 20150623(Red Hat 4.8.5-4)与-std=c99成功编译,但给了我一个警告。我不能处理这个警告,我甚至不知道它有什么问题。代码在这里:

#include <stdio.h>
#define COLS 4
int SumOf2DArray(const int array[][COLS], int rows);
int SumOfArray(const int array[], int element_number);
int main(void) {
  int sum_of_array0, sum_of_2d_array, sum_of_array1;
  int *array, (*dimensions)[COLS];
  array = (int [2]){10, 20};
  dimensions = (int [2][COLS]){{1, 2, 3, -9}, {4, 5, 6, -8}};
  sum_of_array0 = SumOfArray(array, 2);
  sum_of_2d_array = SumOf2DArray(dimensions, 2);
  sum_of_array1 = SumOfArray((int []){4, 4, 4, 5, 5, 5}, 6);
  printf("sum_of_array0 = %d \t sum_of_2d_array = %d \t sum_of_array1 = %d\n",
    sum_of_array0, sum_of_2d_array, sum_of_array1);
  return 0;
}
int SumOf2DArray(const int array[][COLS], int rows) {
  int sum_of_2d_array = 0;
  for (int rows_i = 0; rows_i < rows; rows_i++) {
    for (int cols_i = 0; cols_i < COLS; cols_i++) {
      sum_of_2d_array += array[rows_i][cols_i];
    }
  }
  return sum_of_2d_array;
}
int SumOfArray(const int array[], int element_number) {
  int sum_of_array = 0;
  for (int i = 0; i < element_number; i++) {
    sum_of_array += array[i];
  }
  return sum_of_array;
}

警告在这里:

chapter10_compound_literals.c: In function ‘main’:
chapter10_compound_literals.c:25:3: warning: passing argument 1 of ‘SumOf2DArray’ from incompatible pointer type [enabled by default]
   sum_of_2d_array = SumOf2DArray(dimensions, 2);
   ^
chapter10_compound_literals.c:15:5: note: expected ‘const int (*)[4]’ but argument is of type ‘int (*)[4]’
 int SumOf2DArray(const int array[][COLS], int rows);

现在,我假设我有一个二维数组:int array[2][3] = {{1, 2, 3}, {3, 4, 5}},我有一个函数:int SumOf2DArray(const int array[][3], int rows)

上面代码中的方法是使用指针(int (*pointer)[3] = array),但是收到警告,我试图直接使用array传递参数,但是同样的警告。

如何将数组传递给函数?

1 个答案:

答案 0 :(得分:-1)

我认为在编译器输出中最清楚地说明了答案:

expected ‘const int (*)[4]’ but argument is of type ‘int (*)[4]’

类型 int 实际上与 const int 完全不同。如果您尝试更改任何 const (例如分配给它),您的代码可能会被视为有错误,但显然您可以更改 int 。我的建议是不要使用 const ,除非你知道你在做什么 - 这可能需要一些研究,因为 const 变得复杂,因为类型变得复杂。 / p>