为什么只读复合文字的值会发生变化?

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 的使用时,编译器将显示错误或警告=]类型。