【问题标题】:Why is it not OK to pass `char **` to a function that takes a `const char **` in C? [duplicate]为什么不能将 `char **` 传递给 C 中采用 `const char **` 的函数? [复制]
【发布时间】:2010-08-16 18:14:50
【问题描述】:

可能重复:
Why can’t I convert ‘char**’ to a ‘const char* const*’ in C?

我很好奇,为什么我不能将char ** 传递给const char ** 函数?虽然可以将 char * 传递给 const char * 函数,但使用双指针似乎不太好。我认为添加 constness 总是可以的(但不能删除 constness),但现在看来我错了。

Gcc 编译器给了我错误:

note: expected ‘const char **’ but argument is of type ‘char **’

这里是sn-p的代码:

int f(const char **a) { }

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

有什么想法吗?

【问题讨论】:

标签: c pointers


【解决方案1】:

因为编译器无法保证安全。

请参阅 comp.lang.c 常见问题解答中的 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 的承诺——最终指向的值不会被修改——无法兑现的情况。

【讨论】:

  • 这是错误的:“在第 4 行,我们将 const char * 分配给 const char *;这显然是合法的。” *p2char*&cconst char*。在声明 *p2 = &c 中有一个 const char*char* 的赋值,如果没有常量转换,这是不合法的。
  • @JonathanMee No. p2const char** 类型;它是一个指向char 常量的指针。 *p2 的类型为 const char*
  • 呃,你是对的。问题出在第 3 行。似乎阻止它真的可以解决问题......
  • @JonathanMee 是的,这就是不允许第 3 行的原因。 =)
猜你喜欢
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 2013-11-20
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多