在C中使用const签名的错误调用

Gui*_*uid 6 c warnings const

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

为什么我接到以下foo调用警告(gcc 42.2)?

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

(...)
char **str;
foo(str);
(...)
Run Code Online (Sandbox Code Playgroud)

我明白了为什么我们不能称之为一个以外的功能char **const char **,但相反似乎确定我,为什么下面的警告?

warning: passing argument 1 of 'foo' from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)

Die*_*Epp 8

这是错误的.这里没有与编译器争论的真正空间,因为规范支持它.这是一个例子,它解释了为什么它是错误的:

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

void func2(void)
{
    char *a;
    func(&a);
    *a = 'x';
}
Run Code Online (Sandbox Code Playgroud)

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

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

编译器发出警告而不是错误的主要原因是因为许多旧代码不使用const限定符,如果代码是今天编写的.