我不明白我们如何const
通过指针修改变量的值。这不是未定义的行为吗?
是的,这是未定义的行为:
引自 C18, 6.7.3/7:
“如果尝试通过使用具有非 const 限定类型的左值来修改使用 const 限定类型定义的对象,则行为未定义。”
但仅仅因为行为未定义,并不意味着您可能无法做到这一点。据我所知,情况确实如此,大多数时候你的程序包含任何未定义的行为,而不是警告你——这是一个大问题。
幸运的是,在这种情况下,编译 fe 时:
#include <stdio.h>
int main(){
const int a = 25;
int *p = &a;
*p = 26;
printf("a = %d",a);
}
编译器会抛出警告:
初始化从指针目标类型 [-Wdiscarded-qualifiers] (gcc) 中丢弃“const”限定符
或者
警告:使用 'const int *' 类型的表达式初始化 'int *' 会丢弃限定符 [-Wincompatible-pointer-types-discards-qualifiers] (clang)
但是尽管代码包含导致未定义行为的部分,并且您永远无法确定它会在任何执行时打印什么,但您会编译该恶意程序(-Werror
当然没有选项)。
我们可以修改const
变量的值吗?
所以,是的 - 不幸的是。一个人实际上可以修改一个const
对象,但你永远不应该这样做,无论是有意还是无意。
使用register
关键字的方法可能很有效,因为register
标记变量的地址不能获取其地址 - 这意味着您不能为指针分配相对变量的地址,也不能将其作为相应指针类型的参数传递给函数。