可能重复:
Why can’t I convert ‘char**’ to a ‘const char* const*’ in C?
我很好奇,为什么我不能通过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);
}
有什么想法吗?
答案 0 :(得分:18)
因为编译器无法保证安全。
请参阅comp.lang.c FAQ中的Q11.10:Why can't I pass a char **
to a function which expects a 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
的承诺 - 最终指向的价值不会被修改 - 无法保留。