为什么只读复合文字的值会发生变化?
Why the value is changed for the Read-Only Compound Literal?
我正在研究 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 限定类型的左值修改 const 限定对象的值,则为 undefined behavior。
引用 C11
,第 6.7.3 章
If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined. [...]
此处的赋值从初始化程序中丢弃了 const 限定符,并将其分配给非 const 限定的左值,因此您的编译器试图警告您潜在的陷阱。
您将 const int[]
数组分配给指向非 const
值的指针。这意味着 you 因为程序员明确放弃了 const
限定符。 (右侧的 const
实际上确实将文字声明为 const
。)
编译器对此发出警告。
要修复您必须使用的警告
const int *r = (const int[3]){6, 14, -98}; // Read Only compound Literal
然后你会在
行得到一个错误
*r += 99;
你要修改的地方的值。
const
限定符不会“放弃任何更改”。如您所见,有多种方法可以修改该值。 (但这是未定义的行为。)
const
限定符告诉编译器不应修改该值,当您的代码修改它或检测到可能导致修改值 [=13 的使用时,编译器将显示错误或警告=]类型。
我正在研究 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 限定类型的左值修改 const 限定对象的值,则为 undefined behavior。
引用 C11
,第 6.7.3 章
If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined. [...]
此处的赋值从初始化程序中丢弃了 const 限定符,并将其分配给非 const 限定的左值,因此您的编译器试图警告您潜在的陷阱。
您将 const int[]
数组分配给指向非 const
值的指针。这意味着 you 因为程序员明确放弃了 const
限定符。 (右侧的 const
实际上确实将文字声明为 const
。)
编译器对此发出警告。
要修复您必须使用的警告
const int *r = (const int[3]){6, 14, -98}; // Read Only compound Literal
然后你会在
行得到一个错误*r += 99;
你要修改的地方的值。
const
限定符不会“放弃任何更改”。如您所见,有多种方法可以修改该值。 (但这是未定义的行为。)
const
限定符告诉编译器不应修改该值,当您的代码修改它或检测到可能导致修改值 [=13 的使用时,编译器将显示错误或警告=]类型。