C:将“char (*)”传递给类型“char (*)[5]”的参数的指针类型不兼容,但程序工作正常

C: incompatible pointer types passing 'char (*)' to parameter of type 'char (*)[5]', but program works fine

提问人:Noootron27 提问时间:11/30/2022 更新时间:11/30/2022 访问量:85

问:

我收到以下警告:

警告:将“char ()”传递给类型为“char ()[5]”的参数的不兼容指针类型 [-Wincompatible-pointer-types] printField(字段[5]);

printField 函数如下所示:

void printField(char (*field)[5])
{
...
}

我给它的字段定义如下:

char (*field) = get_field(input);

下面是函数调用:

printField(field);

现在,我确实明白了,显然发生了某种不匹配,但我无法说出该改变什么才能让它不再存在。如果有人能帮助我,我将不胜感激。

数组 C 指针 警告 不兼容

评论


答:

1赞 Some programmer dude 11/30/2022 #1

假设返回指向数组的第一个元素(字符)的指针(以 null 结尾的字符串),那么它恰好与指向数组本身的指针相同。get_field

如果我们用一个简单的数组来说明它:

char s[5];

然后,这在内存中看起来像这样(添加了指针):

+------+------+------+------+------+
| s[0] | s[1] | s[2] | s[3] | s[4] |
+------+------+------+------+------+
^
|
&s[0]
|
&s

现在可以看出,有两个指针指向同一位置:和 .&a[0]&s

&s[0]是使用数组衰减到什么,它是类型。char *

&s是指向数组本身的指针,类型为 。char (*)[5]

当我们将它应用于您的案例时,是第一个指针,它指向数组的第一个元素。它恰好与指向数组本身的指针的位置相同,这是预期的。fieldprintField

这就是它“有效”的原因。但是你不应该那样做,你应该修复函数来代替一个参数:char *

void printField(char *field);
0赞 0___________ 11/30/2022 #2

类型不同。

  • char *ptr;声明指向 char 的指针
  • char (*ptr)[5];声明指向 5 个字符数组的指针。

这些指针类型不兼容 - 因此编译器警告。

在您的例子中,两个指针都指向内存中的同一位置(这就是程序工作的原因)。