C语言中const关键字的歧义

C语言中const关键字的歧义,c,string,constants,C,String,Constants,我有一些代码: int main() { const char *string1 = "foo"; char *string2 = "bar"; string1 = string2; return 0; } 当我构建它时,不会发出任何警告。但是, int main() { const char *string1 = "foo"; char *string2 = "bar&q

我有一些代码:

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的常量指针
  • 常量字符*常量str3
    -str3是指向常量字符的常量指针
str1
可以重新指定为指向其他对象,但由于它是指向
const char
的指针,因此不能将其用作l值,因此禁止使用
*str1=
<另一方面,code>str2不能重新指定为指向其他对象,但它可以用作l值。使用str3
str3
您不能执行任何这些操作

另外,请注意,
const char*str
char const*str
是等效的。要了解声明的作用,或了解如何声明某些内容,请使用此网站:

我本以为string1不会被重新分配,因为它是常量

但事实并非如此

它是一个非
const
指针,指向
const
对象(特别是
constchar
s)

代码麻烦的唯一原因是,您不应该隐式地将
const char*
转换为
char*
,原因很明显-只要您愿意,就在指针对象类型上删除
const
,这会破坏
const
的安全性!这就是你得到警告的原因

反过来说,添加
const
ness(如第一个示例所示)就可以了


tl;这不是你的任务;这是您正在分配的内容。

将其视为:
(const char)*string1=…
。请注意警告“.from pointer target type..”。将常量指针转换为非常量指针完全可以。@klutt我没说不是。我们说的是尖头类型。这个问题本身就证明这是行不通的,我的答案是为什么。(好吧,FSVO)不起作用……看来这只是C++编译器的警告。这是C++中的一个很难的错误。这绝对是个坏主意。问题表明它发出了警告。并不是说它不起作用。你说尖头是什么意思?指针指向的是字符串类型,它的类型是非STOR.YEP,C++在铸造方面有不同于C的规则,因此不幸的是,这个答案是完全错误的。