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

标签 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 后具有我期望的值,但编译器抛出该警告...在询问了一些同事后,我明白了为什么我收到该警告,但我们不知道为什么代码仍然有效。

我正在寻找为什么会发生这种情况的解释,修复方法非常简单,从调用中删除 & 。

最佳答案

如果您使用sString,它将衰减为指向其第一个元素的指针,即&sString[0],其类型为char * .

当您使用&sString时,您将获得一个指向数组的指针,其类型为char (*)[1024]

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

要解决该警告,请在调用中删除地址运算符 &,因此只需这样做

myfunc(sString, sizeof(string));
//     ^
// Note: No & here

关于c - 为什么我的指针类型不兼容,但代码仍然有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42506798/

相关文章:

c - 预期说明符限定符列表位于 'if' 之前

c++ - 如果指针已经被删除,指针容器如何拥有指针的所有权?

c++ - 如何在字符指针数组中保留指向每个单词的指针?

c++ - 从指向基类的指针调用派生类的复制构造?

c - list - C(家庭作业)

c - 如何告诉 gcc 通过在代码的每一行调用我自己的函数来检测代码?

c - 给定二维数组中的标记单元格,找到由这些标记单元格形成的重复形状

c - 我不明白这个算法的时间复杂度是如何计算的

交换指针时的困惑

delphi - 读取任意内存位置?可能的?