Pass ein zweidimensionales Array zu einer Funktion des konstanten Parameters

Ich habe von @ gelerC Primer Plus Wenn Sie verhindern möchten, dass ein Array versehentlich von einer Funktion geändert wird, sollten Sie @ hinzufügeconst -Modifikator vor der Zeigerdeklaration im Header der Funktionsdefinition.

Folgend diesem sinnvollen Rat, versuche ich im folgenden minimalen Beispiel, ein nicht konstantes zweidimensionales Array zu übergebenarray zur FunktionSum2D, ein Parameter davon ist einpointer-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;
}

Jedoch,gcc kann diesen Code nicht erfolgreich kompilieren, ohne die folgenden Warnungen auszugeben:

$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) Warum die Warnung?

2) Wie kann ich das "Rauschen" beseitigen? (Abgesehen vom Hinzufügen vonconst zuarray Erklärung.)

(Wenn dasarray und Funktion verwenden beide eindimensionale Arrays, es gibt keine Warnung.)

System Information

Ubuntu 14.04LTS

Compiler: gcc 4.8.2

Antworten auf die Frage(4)

Ihre Antwort auf die Frage