c-试图通过指针编辑常量变量时的怪异行为



为了提高我对指针和常量的了解,我编写了以下代码:

int main() {
const int value = 2;
int *pvalue = &value;
*pvalue = 3;
printf("value: %dn", value);
printf("*pvalue: %dn", *pvalue);
printf("&value: %pn", &value);
printf("pvalue: %p", pvalue);
return 0;
}

据我所知,value不能直接编辑,因为它被声明为const。尽管如此,它可以通过*pvalue进行间接编辑。至少,我是这样理解编译器在int *pvalue = &value;行抛出的下面的警告的。

警告:初始化从指针目标类型中丢弃"const"限定符[-Wdiscarded限定符]|

然而,当我运行代码时,我得到的输出是:

value: 2
*pvalue: 3
&value: 000000000060FE1C
pvalue: 000000000060FE1C

value*pvalue不同,但它们似乎指向相同的内存地址。

我错过了什么?

您忽略了编译器诊断,而不应该这样做。

无论如何,使用const可以禁止对限定对象的写访问。编译器肯定不会接受value = 23;

但是通过指针,您删除了这个限制,并调用了Undefined Behavior。在实际目标上,由于变量很可能位于堆栈上,因此可以通过硬件方式写入。这种行为包括在";未定义";。

将其放入静态内存中,很可能会出现运行时异常,因为变量将在写保护内存中分配。

最新更新