为什么将'char**'传递给在C中接受'const char**'的函数不合适?

为什么将'char**'传递给在C中接受'const char**'的函数不合适?,c,pointers,C,Pointers,可能重复: 我很好奇,为什么我不能将char**传递给const char**函数?其中,由于可以将char*传递给const char*函数,因此使用双指针似乎不合适。我原以为增加常数总是可以的(但放弃常数却不行),但现在看来我错了 Gcc编译器给了我一个错误: note: expected ‘const char **’ but argument is of type ‘char **’ 以下是代码片段: int f(const char **a) { } int main() {

可能重复:

我很好奇,为什么我不能将
char**
传递给
const char**
函数?其中,由于可以将
char*
传递给
const char*
函数,因此使用双指针似乎不合适。我原以为增加常数总是可以的(但放弃常数却不行),但现在看来我错了

Gcc编译器给了我一个错误:

note: expected ‘const char **’ but argument is of type ‘char **’
以下是代码片段:

int f(const char **a) { }

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

有什么想法吗?

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

参见公司lang.c常见问题解答中的Q11.10:

假设您执行了以下更复杂的一系列 任务:

const char c = 'x';    /* 1 */
char *p1;              /* 2 */
const char **p2 = &p1; /* 3 */
*p2 = &c;              /* 4 */
*p1 = 'X';             /* 5 */
在第3行中,我们将
char**
分配给
const char**
。(编译器应该抱怨。)在第4行中,我们将
常量字符*
分配给
常量字符*
;这显然是合法的。在第5行中,我们修改了
char*
所指向的内容——这应该是合法的。但是,
p1
最终指向
c
,即
const
。这发生在第4行,因为p2实际上是p1。这是在第3行设置的,这是一个不允许的表单赋值,这正是第3行不允许的原因

char**
分配给
const char**
(如第3行和原始问题中所示)不会立即产生危险。但它设置了这样一种情况,
p2
的承诺——最终指向的值不会被修改——无法兑现


顺便说一句,对于投票结束的人来说,这似乎类似于:这不是一个完全相同的,因为这是关于
const char*const*
。(然而,有些答案是相关的。)这是错误的:“在第4行中,我们将常量字符*分配给常量字符*;这显然是合法的。”
*p2
字符*
&c
常量字符*
。在语句
*p2=&c
中有一个
const char*
赋值给
char*
,如果没有常量强制转换,这是不合法的。@JonathanMee No.
p2
属于
const char**
类型;它是指向
char
常量的指针<代码>*p2是
const char*
类型。啊,你说得对。问题出在3号线。看来阻止这一点真的能解决问题…@JonathanMee是的,这就是为什么第三行被禁止的原因。=)