Я узнал от C Primer Plus, что если вы хотите защитить массив от случайного изменения функции, вы должны добавить модификатор const
до объявления указателя в заголовке определения функции.Передайте двумерный массив функции постоянного параметра
После этого разумного совета, в следующем минимальном примере, я пытаюсь передать непостоянный двумерный массив array
функциям Sum2D
, один параметр, который является pointer-to-const-int[2]
.
#include <stdio.h>
#define ROWS 2
#define COLS 2
int Sum2D(const int ar[][COLS], int rows); //use `const` to protect input array
int main(void)
{
int array[ROWS][COLS]={{1,2},{3,4}}; //the non-constant array
printf("%d\n", Sum2D(array,ROWS));
return 0;
}
int Sum2D(const int ar[][COLS], int rows)
{
int total=0;
int i,j;
for(i=0 ; i<rows ; i++)
{
for(j=0 ; j<COLS ; j++)
{
total+=ar[i][j];
}
}
return total;
}
Однако gcc
не может успешно скомпилировать этот код, не выполнив следующие предупреждения:
$gcc -ggdb3 -Wall -Wextra -o test test.c
test.c: In function ‘main’:
test.c:16:2: warning: passing argument 1 of ‘Sum2D’ from incompatible pointer type [enabled by default]
printf("%d\n", Sum2D(array,4));
^
test.c:4:5: note: expected ‘const int (*)[4]’ but argument is of type ‘int (*)[4]’
int Sum2D(const int ar[][COLS], int rows);
^
1) Почему предупреждение?
2) Как я могу устранить «шум»? (Помимо добавления const
к array
декларации.)
(Если array
и функционируют оба используют один одномерный массив, нет никакого предупреждения.)
System information:
Ubuntu 14.04LTS
Compiler: gcc 4.8.2
Очень прямолинейно. Функция 'Sum2D' ожидает получить массив const 2d, но вы даете ему не const. Это может быть опасно, но не обязательно, поэтому предупреждение, а не ошибка. –
@inneedofhelp На самом деле функция ожидает * указателя * для размера COLS-массива 'const int'. В параметре функции 'const int ar [] [COLS]' является таким же, как 'const int (* ar) [COLS]' – juanchopanza
Есть ли причина для вашего параметра 'rows', а не просто использование определенного измерения? – Mario