我收到了这个警告:incompatible pointer types passing 'char (*)[1024]' to parameter of type 'char *'
我的代码如下所示:
myfunc(char* sString, size_t s_tString)
{
memset(sString, '\0', s_tString);
...
fPipe = (FILE *)popen (sString, "r");
...
}
int main()
{
...
char sString[1024];
myfunc(&sString, sizeof(sString));
...
}
调用myfunc之后,sString具有我期望的值,但是编译器抛出了警告......在询问了一些同事后,我明白为什么我会收到警告,但我们不知道为什么代码仍在工作。
我正在寻找解释为什么会发生这种情况的解释,这个解决方案非常简单,并且可以使用& amp;来自电话。
答案 0 :(得分:2)
如果您使用sString
,则会衰减到指向其第一个元素的指针,即类型为&sString[0]
的{{1}}。
当您使用char *
时,您会获得指向数组的指针,该指针的类型为&sString
。
这两个指针在语义上非常不同,但幸运的是,它们都指向相同的位置,因此您调用的函数按预期工作。
要解决警告,请在通话中删除操作员地址char (*)[1024]
,这样才能执行
&
答案 1 :(得分:2)
它起作用,因为myfunc(sString, sizeof(string));
// ^
// Note: No & here
和&sString
的实际值最终相同。类型不同,触发警告,但被调用函数看到的地址仍然是合理的,即它可以被视为字符缓冲区。
这是因为没有表示sString
本身的运行时内存,因此当你获取其地址时所有编译器都可以返回第一个元素的地址。