【问题标题】:a bad call with a const signature in C [duplicate]C中带有const签名的错误调用[重复]
【发布时间】:2012-12-06 15:08:47
【问题描述】:

可能重复:
why isnt it legal to convert (pointer to pointer to non-const) to a (pointer to pointer to a const)

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

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

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

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

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

【问题讨论】:

  • 你使用了哪些编译标签?
  • 我认为这是不合法的,尽管有这样一个不兼容的分配你可以在某些情况下颠覆 const 而无需强制转换。

标签: c warnings constants


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-04-17
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2016-03-30
    • 2019-09-23
    相关资源
    最近更新 更多