C 中 const 关键字的歧义

Ambiguity with const keyword in C

我有一些代码:

int main() {
    const char *string1 = "foo";
    char *string2 = "bar";

    string1 = string2;

    return 0;
}

当我构建它时,没有发出警告。然而,

int main() {
    const char *string1 = "foo";
    char *string2 = "bar";

    string2 = string1;

    return 0;
}

发出警告:

warning: assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
     string2 = string1;
             ^

以我目前对 C 的基本知识,我会认为 string1 不会被重新分配,因为它是 const。令我惊讶的是,第一个代码片段中的代码没有警告,而第二个代码片段则相反。

对发生的事情有任何解释吗?谢谢!

完全可以。这里的(潜在)问题是您指向的字符串是字符串文字,因此修改它们会调用未定义的行为。

你把它混在一起的可能是这样的:

  • const char *str1 - str1 是指向 const char
  • 的指针
  • char * const str2 - str2 是指向 char
  • 的常量指针
  • const char * const str3 - str3 是指向 const char
  • 的 const 指针

str1 可以重新赋值指向别的东西,但是因为它是指向 const char 的指针,所以它不能用作 l-value,所以 *str1 = <something> 是禁止。另一方面,str2 无法重新分配以指向其他内容,但它可以用作 l-value。 str3 你不能做任何这些。

另外,请注意 const char *strchar const *str 是等价的。要了解声明的作用,或了解如何声明某些内容,请使用此站点:https://cdecl.org/

I would have thought that string1 would not be reassignable since it is const.

但事实并非如此!

这是一个非const指针,指向const事物(具体来说,const chars)。

你的代码麻烦的唯一原因是你不应该隐式地将 const char* 转换为 char*,原因很明显——这会破坏 const-随时将 const 放在尖头类型上的安全性!这就是您收到警告的原因。

反过来,添加 constness,就像你的第一个例子一样,很好。

tl;dr:这不是你的任务;这就是您要分配的内容。