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 *str
和 char const *str
是等价的。要了解声明的作用,或了解如何声明某些内容,请使用此站点:https://cdecl.org/
I would have thought that string1 would not be reassignable since it is const.
但事实并非如此!
这是一个非const
指针,指向const
事物(具体来说,const char
s)。
你的代码麻烦的唯一原因是你不应该隐式地将 const char*
转换为 char*
,原因很明显——这会破坏 const
-随时将 const
放在尖头类型上的安全性!这就是您收到警告的原因。
反过来,添加 const
ness,就像你的第一个例子一样,很好。
tl;dr:这不是你的任务;这就是您要分配的内容。
我有一些代码:
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 *str
和 char const *str
是等价的。要了解声明的作用,或了解如何声明某些内容,请使用此站点:https://cdecl.org/
I would have thought that string1 would not be reassignable since it is const.
但事实并非如此!
这是一个非const
指针,指向const
事物(具体来说,const char
s)。
你的代码麻烦的唯一原因是你不应该隐式地将 const char*
转换为 char*
,原因很明显——这会破坏 const
-随时将 const
放在尖头类型上的安全性!这就是您收到警告的原因。
反过来,添加 const
ness,就像你的第一个例子一样,很好。
tl;dr:这不是你的任务;这就是您要分配的内容。