passing arg 1 of `foo' from incompatible pointer type

后端 未结 3 985
囚心锁ツ
囚心锁ツ 2021-01-26 10:11

Why this shows warning:

#include
foo (const char **p)
{ 

}

int main(int argc , char **argv)
{
    foo(argv);
}

But following

相关标签:
3条回答
  • 2021-01-26 10:32

    Depending on your compilation flags, you might need an explicit cast when assigning cp's content to ccp.

    0 讨论(0)
  • 2021-01-26 10:38

    See the C FAQ list

    You can cast in order to remove warnings:

    foo((const char **)argv);
    

    But as FAQ says: the need for such a cast may indicate a deeper problem which the cast doesn't really fix.

    0 讨论(0)
  • 2021-01-26 10:56

    In the first version you are casting between two different types of pointer not simply adding a const to the pointer.

    • char ** is a pointer to a (pointer to a char)
    • const char ** is a pointer to a (pointer to a const char)

    As you can see these pointer point to different types similar to the more obviously questionable:

    int *i;
    double *d;
    d = i;
    

    In your second example you see that you can cast from a pointer to a const pointer so if you were to apply this to your situation you would need to have a const pointer to (a pointer to a char).

    foo(char * const *p);
    
    0 讨论(0)
提交回复
热议问题