GCC 警告:“从不兼容的指针类型初始化 [默认启用]”

GCC Warning: "Initialization from incompatible pointer type [enabled by default]"

提问人:John Pace 提问时间:3/31/2021 最后编辑:Some programmer dudeJohn Pace 更新时间:3/31/2021 访问量:522

问:

''' bool loadArray(unsigned int array[8][8]) { int* p = array; ... } '''

我有一个函数,可以使用用户输入加载array[8][8]。一切正常,但是尝试使用 gcc (c99) 编译它时,它给了我一个警告(指向“int* p = array;”),上面写着:“从不兼容的指针类型初始化 [默认启用]”。

我在代码中到底做错了什么?

数组 C 指针 GCC 警告

评论

1赞 Some programmer dude 3/31/2021
作为参数,定义实际上与 相同。并且类型与类型(类型)不兼容。正如编译器告诉你的那样。你到底想做什么?的目的是什么?unsigned int array[8][8]unsigned int (*array)[8]int (*)[8]int *pp
0赞 John Pace 3/31/2021
@Someprogrammerdude我想创建一个指向数组开头的指针,以便我可以填充它。
0赞 Some programmer dude 3/31/2021
为什么不能使用?为什么需要指针?如何“填充”“数组”?请尝试创建一个最小的可重复示例来向我们展示。array[i][j]
0赞 Some programmer dude 3/31/2021
对于将来的问题,请参加 SO 导览,阅读如何提问,以及这个问题清单。并了解如何编辑您的问题。
0赞 John Pace 3/31/2021
@Someprogrammerdude我可以这样做,但我认为一个“更时尚”的解决方案是将 2D 数组转换为 1D 数组并将其填充到一个 for 循环中 'for (int i = 0; i < 64; i++) { fill *(p + i) }'

答:

0赞 Lundin 3/31/2021 #1

警告是不言自明的。不能用 .它是无效的 C,因此您会收到编译器消息。unsigned int array[8][8]int*

如果它是一个一维数组,你可以这样做,因为当在大多数表达式中使用或用作函数参数时,这样的数组会“衰减”为指向第一个元素的指针。

但是在数组数组的情况下,指向第一个元素的指针就变成了 “数组指针” 。可能不是你想要的。unsigned int [8][8]unsigned int (*)[8]

相反,您可以遍历数组的每个维度:

for(size_t i=0; i<8; i++)
{
  int* p = array[i];
}

或者,如果您只想填充数组,则:

for(size_t i=0; i<8; i++)
{
  for(size_t j=0; j<8; j++)
  {
    array[i][j] = something;
  }
}