【问题标题】:GCC Warning: "Initialization from incompatible pointer type [enabled by default]"GCC 警告:“从不兼容的指针类型初始化 [默认启用]”
【发布时间】:2021-06-27 06:39:09
【问题描述】:

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

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

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

【问题讨论】:

  • 作为参数,unsigned int array[8][8] 的定义实际上与unsigned int (*array)[8] 相同。并且int (*)[8] 类型与int * 类型(p 的类型)不兼容。正如编译器告诉你的那样。你真正想做什么? p的目的是什么?
  • @Someprogrammerdude 我想创建一个指向数组开头的指针,以便我可以填充它。
  • 为什么不能使用array[i][j]?为什么需要指针?你如何“填充”“数组”?请尝试创建minimal reproducible example 向我们展示。
  • 对于未来的问题,请使用 SO tour、阅读 How to Ask 以及 this question checklist。并了解如何edit您的问题。
  • @Someprogrammerdude 我可以这样做,但我认为“更时尚”的解决方案是将二维数组转换为一维数组并将其填充到一个 for 循环中'for (int i = 0; i

标签: arrays c pointers gcc warnings


【解决方案1】:

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

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

但是在数组数组的情况下,指向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;
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 2013-12-16
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多