【发布时间】:2020-12-29 14:17:41
【问题描述】:
我正在研究 C 中的只读复合文字。当我尝试在取消引用运算符的帮助下更改其值时,值发生了变化! 我现在很困惑为什么会这样。
此外,当我编译并运行程序时(不尝试更改其值),它会显示此错误:
Code_Testing.c:5:14: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
5 | int *r = (const int[3]){6, 14, -98}; // Read Only compound Literal
|
我不明白为什么它忽略了const 限定符。
我知道const 限定符会丢弃任何更改,但这里复合文字的值发生了变化!
你能解释一下我在哪里犯了错误吗?
我写的程序是这样的:
#include <stdio.h>
int main(void)
{
int *r = (const int[3]){6, 14, -98}; // Read Only compound Literal
*r += 99;
printf("The changed value is = %d", *r);
return 0;
}
输出是:
Code_Testing.c:5:14: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
5 | int *r = (const int[3]){6, 14, -98}; // Read Only compound Literal
| ^
The changed value is = 105
【问题讨论】:
-
我知道
const限定符会丢弃任何更改 当您通过赋值或显式转换将其丢弃时不会。 C 语言中的const非常弱——它甚至在相当长的一段时间内都不是语言的一部分。 -
“只读复合文字”是什么意思?复合文字通常不是只读的,但如果您使用
const定义它们,它们就是只读的。
标签: c constants compound-literals