为什么不能将`char**'传递给在C中使用`const char**`的函数?

bod*_*ydo 14 c pointers

可能重复:
为什么我不能在C中将'char**'转换为'const char*const*'?

我很好奇,为什么我不能传递char **const char **函数?在传递char *const char *函数的情况下,使用双指针执行它似乎不行.我认为添加常量总是可以的(但不能删除常量)但现在看来我错了.

Gcc编译器给我错误的错误:

note: expected ‘const char **’ but argument is of type ‘char **’
Run Code Online (Sandbox Code Playgroud)

这是代码片段:

int f(const char **a) { }

int main() {
    char *a;
    f(&a);
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

jam*_*lin 18

因为编译器不能保证安全.

请参阅comp.lang.c中的Q11.10 FAQ:为什么我不能将a传递char **给期望的函数const char **

假设您执行了以下更复杂的分配系列:

const char c = 'x';    /* 1 */
char *p1;              /* 2 */
const char **p2 = &p1; /* 3 */
*p2 = &c;              /* 4 */
*p1 = 'X';             /* 5 */
Run Code Online (Sandbox Code Playgroud)

在第3行中,我们将a分配char **给a const char **.(编译器应该抱怨.)在第4行,我们分配a const char *到a const char *; 这显然是合法的.在第5行,我们修改了char *要点 - 这应该是合法的.然而,p1最终指向c,这是const.这是第4行,因为*p2真的p1.这是在第3行中设置的,它是一个不允许的表单的赋值,这正是为什么不允许第3行的原因.

将a分配char **const char **(如第3行和原始问题中)并不是立即危险的.但它确立了一种情况,即p2承诺 - 最终指向的价值不会被修改 - 无法保留.