首頁>Program>source

我从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)如何消除"噪音"?(除了添加 constarray 宣告。)

(如果是 array 和函式都使用一維陣列,没有警告。)

System information:

Ubuntu 14.04LTS

Compiler: gcc 4.8.2

最新回復
  • 5月前
    1 #

    這是C語言設計中的不幸"錯誤". T (*p)[N] 不会隱式轉換為 T const (*p)[N] .您將不得不使用丑陋的演員表,或者要让功能引數不接受 const


    乍一看,這種轉換似乎是合法的. C11 6.3.2.3/2:

    For any qualifierq, a pointer to a non-q-qualified type may be converted to a pointer to theq-qualified version of the type;

    但是也請看C11 6.7.3 / 9(在C99中為/ 8):

    If the specification of an array type includes any type qualifiers, the element type is so-qualified, not the array type.

    最後一條引述說 int const[4]not 被认為是 const 合格版本的 int[4] .其實這是一个非維兹 合格的4个 const陣列 s. const intint[4] 是不同元素型別的陣列.

    因此6.3.2.3/2實際上不允许 int const[4] 轉換為 int (*)[4]


    另一个奇怪的情况是 int const (*)[4]出現此問题 陣列顯示的是使用typedef的時間; 例如:

    const
    

    這將匯致編譯器錯誤: typedef int X[5]; void func1( X const x ); void func1( int const x[5] ); 意味着 X const x 是const,但它指向非const x陣列 s; 而 int 意思是 int const x[5] 不是const,而是指向const ints陣列!

    在這裏进一步阅讀,感谢@JensGustedt

    here

    您可以在呼叫函式時键入強製轉換陣列.它不会自動將非const轉換為const。 您可以使用它。

    x
    
    Sum2D( (const int (*)[])array, ROWS );

  • matlab:對齐已捕获的RGB和深度圖像
  • python:如何在pygame中等待一段時間?