为什么不能将`char **’传递给在C中带有’const char **`的函数?

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

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

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

 note: expected 'const char **' but argument is of type 'char **' 

这是代码片段:

 int f(const char **a) { } int main() { char *a; f(&a); } 

有任何想法吗?

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

请参阅comp.lang.c中的Q11.10 FAQ: 为什么我不能将char **传递给需要const char **const char **

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

 const char c = 'x'; /* 1 */ char *p1; /* 2 */ const char **p2 = &p1; /* 3 */ *p2 = &c; /* 4 */ *p1 = 'X'; /* 5 */ 

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

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