提问人:Noootron27 提问时间:11/30/2022 更新时间:11/30/2022 访问量:85
C:将“char (*)”传递给类型“char (*)[5]”的参数的指针类型不兼容,但程序工作正常
C: incompatible pointer types passing 'char (*)' to parameter of type 'char (*)[5]', but program works fine
问:
我收到以下警告:
警告:将“char ()”传递给类型为“char ()[5]”的参数的不兼容指针类型 [-Wincompatible-pointer-types] printField(字段[5]);
printField 函数如下所示:
void printField(char (*field)[5])
{
...
}
我给它的字段定义如下:
char (*field) = get_field(input);
下面是函数调用:
printField(field);
现在,我确实明白了,显然发生了某种不匹配,但我无法说出该改变什么才能让它不再存在。如果有人能帮助我,我将不胜感激。
答:
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]
当我们将它应用于您的案例时,是第一个指针,它指向数组的第一个元素。它恰好与指向数组本身的指针的位置相同,这是预期的。field
printField
这就是它“有效”的原因。但是你不应该那样做,你应该修复函数来代替一个参数:char *
void printField(char *field);
0赞
0___________
11/30/2022
#2
类型不同。
char *ptr;
声明指向char
的指针char (*ptr)[5];
声明指向 5 个字符数组的指针。
这些指针类型不兼容 - 因此编译器警告。
在您的例子中,两个指针都指向内存中的同一位置(这就是程序工作的原因)。
评论