为什么不能将`char **'传递给在C中使用`const char **`的函数?

时间:2010-08-16 18:14:51

标签: c pointers

  

可能重复:
  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);
}

有什么想法吗?

1 个答案:

答案 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的承诺 - 最终指向的价值不会被修改 - 无法保留。