为什么我的指针类型不兼容,但代码仍然有效?

时间:2017-02-28 10:54:48

标签: c pointers

我收到了这个警告: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;来自电话。

2 个答案:

答案 0 :(得分:2)

如果您使用sString,则会衰减到指向其第一个元素的指针,即类型为&sString[0]的{​​{1}}。

当您使用char *时,您会获得指向数组的指针,该指针的类型为&sString

这两个指针在语义上非常不同,但幸运的是,它们都指向相同的位置,因此您调用的函数按预期工作。

要解决警告,请在通话中删除操作员地址char (*)[1024],这样才能执行

&

答案 1 :(得分:2)

它起作用,因为myfunc(sString, sizeof(string)); // ^ // Note: No & here &sString的实际值最终相同。类型不同,触发警告,但被调用函数看到的地址仍然是合理的,即它可以被视为字符缓冲区。

这是因为没有表示sString本身的运行时内存,因此当你获取其地址时所有编译器都可以返回第一个元素的地址。