警告 C4047:“int **”与“int[2][4]”的间接级别不同 [重复]

Posted

技术标签:

【中文标题】警告 C4047:“int **”与“int[2][4]”的间接级别不同 [重复]【英文标题】:Warning C4047 : 'int **' differs in level of indirection from 'int[2][4]' [duplicate] 【发布时间】:2019-06-21 18:36:24 【问题描述】:

我收到了这个警告,并想知道为什么。我在这里找到了许多线程来解决 VS 2017 编译器中的这个警告,但不是这个特定的组合:为什么 int** 与 int[X][Y] 的间接级别不同?

这是一个生成警告的精简示例:

void testfunc(int ** input, int ** output) 

  /*
  * Do something
  */




int main()



  int   firstvar[2][4];
  int   secondvar[2][4];

  testfunc(firstvar, secondvar);


我明白了:

testcode.c(46): 警告 C4047: 'function': 'int **' 与 'int [2][4]' 的间接级别不同

任何关于为什么会这样或如何解决它的想法都非常感谢。

【问题讨论】:

int**不是二维数组。您不能使用这样的指针访问二维数组元素。 数组不是指针。数组衰减 成指针,但这并不意味着二维数组可以衰减成指针对指针。 c-faq.com/aryptr/index.html 【参考方案1】:
void testfunc(int input[][4], int output[][4])

将是一个更好的方式来通过这个。请注意 int ** 似乎表明它是一个 int * 数组,但它不是。

void onedimension_testfunc(int *odinput, int *odoutput)

     ...


int main ()

      int odfirst[4], odsecond[4];
      onedimention_testfunc(odfirst, odsecond);

在一个维度上,上面的代码可以正常工作。那是因为上面代码中的 odinput/odoutput 指向一个整数数组。但不适用于多个维度。

【讨论】:

值得注意的是,实际传递的类型是int (*input)[4] 感谢您的回复。不过,我没有将它作为 int[][4] 传递的原因是实际尺寸会是可变的。我想我需要将其重新设计为单维结构并传入第一个维度的大小,以便它可以作为 rowsize*r +c 访问 如果您的数据是二维的,则不必使用一维数组。只需使用可变大小的二维数组作为参数,如下所示:void testfunc(size_t n, size_t m, int input[n][m], int output[n][m]) 并像这样调用它:testfunc(2, 4, firstvar, secondvar);

以上是关于警告 C4047:“int **”与“int[2][4]”的间接级别不同 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

第36课 函数与指针分析

(python)数据结构------列表

golang切片

高中数学数学中的int是啥意思?

32位和64位系统,C语言中char,short,int,long,char*,int*,int**各占多少字节

警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)