为什么将'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是的,这就是为什么第三行被禁止的原因。=)