C 为什么更改只读复合文字的值?
我正在研究C中的只读复合文字。当我试图在解引用操作符的帮助下更改其值时,值被更改了!! 我现在不明白为什么会这样 此外,当我编译并运行程序时(不尝试更改其值),它会显示以下错误:C 为什么更改只读复合文字的值?,c,constants,compound-literals,C,Constants,Compound Literals,我正在研究C中的只读复合文字。当我试图在解引用操作符的帮助下更改其值时,值被更改了!! 我现在不明白为什么会这样 此外,当我编译并运行程序时(不尝试更改其值),它会显示以下错误: Code_Testing.c:5:14: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers] 5 | int *r = (const int[3]){6,
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;
}
如果您试图用非常量限定类型的左值修改常量限定对象的值,则它是无效的 引用
C11
,第6.7.3章
如果试图通过使用具有非常量限定类型的左值来修改使用常量限定类型定义的对象,则该行为是未定义的。[……]
此处的赋值将丢弃初始值设定项中的常量限定符,并将其赋值给非常量限定左值,因此编译器试图警告您可能存在的陷阱。如果您尝试使用非常量限定类型的左值修改常量限定对象的值,则它是无效的 引用
C11
,第6.7.3章
如果试图通过使用具有非常量限定类型的左值来修改使用常量限定类型定义的对象,则该行为是未定义的。[……]
此处的赋值将丢弃初始值设定项中的常量限定符,并将其赋值给非常量限定左值,因此编译器试图警告您可能存在的陷阱。将
常量int[]
数组赋值给指向非常量
值的指针。这意味着程序员明确放弃const
限定符时,您将。(右侧的const
实际上将文本声明为const
)
编译器会对此发出警告
要修复警告,您必须使用
const int *r = (const int[3]){6, 14, -98}; // Read Only compound Literal
然后你会在线路上得到一个错误
*r += 99;
要修改值的位置
const
qualifyer不会“放弃任何更改”。如您所见,有多种方法可以修改该值。(但这是未定义的行为。)const
限定符告诉编译器不应修改该值,并且当您的代码将对其进行修改或检测到可能导致修改const
类型值的使用时,编译器将显示错误或警告。指定const int[]
数组指向指向非常量值的指针。这意味着程序员明确放弃const
限定符时,您将。(右侧的const
实际上将文本声明为const
)
编译器会对此发出警告
要修复警告,您必须使用
const int *r = (const int[3]){6, 14, -98}; // Read Only compound Literal
然后你会在线路上得到一个错误
*r += 99;
要修改值的位置
const
qualifyer不会“放弃任何更改”。如您所见,有多种方法可以修改该值。(但这是未定义的行为。)const
限定符告诉编译器不应修改该值,并且当您的代码将修改该值或检测到可能导致修改const
类型值的使用时,编译器将显示错误或警告。谢谢,实际上,我认为将const
添加到右侧会自动使文本成为常量。谢谢你澄清我的疑问:-)你说文字应该是const
是什么意思?C允许修改复合文字。谢谢,实际上我认为在右边添加const
会自动使文字成为常量。谢谢你澄清我的疑问:-)你说文字应该是const
是什么意思?C允许修改复合文本。我知道const
限定符丢弃任何更改,而不是通过赋值或显式强制转换将其丢弃const
定义它们,它们是只读的。我知道const
限定符丢弃任何更改,而不是通过赋值或显式强制转换将其丢弃const
定义它们,它们是只读的。