为什么不能将`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
的承诺 – 最终指向的价值不会被修改 – 无法保留。