首页 > 解决方案 > 如何将非 const 动态多维数组传递给需要 const 多维数组的函数?

问题描述

我在C中编写了以下函数来打印出动态创建的矩阵,但保证在函数内部我

  1. 无法修改给我的指针
  2. 不能修改任何内部指针
  3. 不能修改矩阵中的任何数字

 void const2dPrinter(const int *const *const mat, const int numRows, const int numCols){
  for(int i =0; i < numRows; ++i){
    for(int j =0; j < numCols; ++j){
      printf("%d ", mat[i][j]);
    }
    printf("\n");
  }
 }

我尝试如下调用 main 中的函数

int main(){
  int numRows = 3;
  int numCols = 4;
  int** mat = (int**) malloc(numRows * sizeof(int*);
  for(int i = 0; i < numRows; ++i){
    mat[i] = (int*)malloc(numCols * sizeof(int));
    for(int j = 0; j < numCols; ++j){
      mat[i][j] = (i +1) * (j+1);
    }
  }
  const2dPrinter(mat, numRows, numCols);
...
}

但是我从编译器收到以下错误

error: passing argument 1 of 'const2dPrinter' from incompatible pointer type [-Werror=incompatible-pointer-types]
   const2dPrinter(mat, numRows, numCols);
note: expected 'const int * const* const' but argument is of type 'int **'
   void const2dPrinter(const int *const *const const mat, const int numRows, const int numCols)

我的 IDE 出现以下错误:

Parameter type mismatch: Assigning int** to const int* const* const* discards const qualifier. 

如果我删除函数声明中的第一个 const,该代码将起作用。从 void const2dPrinter( const int *const *const mat, ...){

无效 const2dPrinter(int *const *const mat, ...){

但随后我可以在 const2dPrinter 中修改矩阵的值,这是我不想做的。

我知道我可以在调用函数时将其int**转换为 aconst int *const *const以使事情正常工作,如下所示,但我非常困惑为什么我现在所拥有的东西不起作用,因为我读过的所有内容都说你应该是能够使 const 指针指向非 const 值。

const2dPrinter((const int* const* const) mat, numRows, numCols); //this works 

我已经尝试寻找解决方案,但一直找不到。该代码将在 C++ 编译器上毫无问题地编译,但在我的 C 编译器 (gcc) 上不起作用。

任何有关如何解决我的问题的建议以及对我现在所拥有的为什么不起作用的解释将不胜感激。

标签: cmultidimensional-arraydynamicparameter-passingconstants

解决方案


您必须编写丑陋的演员表(尽管最后一个const是多余的)。C 规范中的一个疏忽是没有隐式转换T **T const * const *.

我认为在实践中,由于这个问题,人们往往最终不会const在存在指针指针或数组指针的情况下使用。您可以使用强制转换和/或通用选择器等来解决它,但事情似乎很快变得复杂,以支持应该是一个简单的操作。


对于您的具体情况,另一种方法可能是使用一维数组来存储矩阵。(由于需要较少数量的分配,这在运行时可能会更有效)。


推荐阅读