6

可能重复:
为什么将(指向非 const 的指针的指针)转换为(指向 const 的指针的指针)是不合法的

为什么我会在以下调用 foo 时收到警告 (gcc 42.2)?

void foo(const char **str)
{
  (*str)++;  
}

(...)
char **str;
foo(str);
(...)

我理解为什么我们不能用 a 调用除 a 之外的函数char **const char **但相反的情况对我来说似乎没问题,那么为什么会出现以下警告?

warning: passing argument 1 of 'foo' from incompatible pointer type
4

1 回答 1

8

这是错误的。这里没有与编译器争论的真正空间,因为它受到规范的支持。这是一个示例,它准确地解释了错误的原因:

void func(const char **p)
{
    *p = "abc";
}

void func2(void)
{
    char *a;
    func(&a);
    *a = 'x';
}

如果编译器没有吐出错误,您的程序可能会崩溃,因为您将覆盖字符串文字(通常在内存中标记为只读)。

所以你不能隐式char **转换为,const char **因为它允许你const从任何值中删除限定符——基本上,它允许你const在没有显式转换的情况下随意忽略。

编译器给出警告而不是错误的主要原因是因为许多旧代码没有使用const今天编写的代码所使用的限定符。

于 2012-12-06T15:15:32.923 回答