c - 是否可以更改 const 全局变量的值?

标签 c pointers

是否可以更改 const 全局变量或 extern 全局变量的值?通过指针?

您可以更改 const 局部变量的值。

最佳答案

尽管在某些 C 实现中可能有可能出现改变 const 对象的值的情况,但这种出现可能是一种幻觉,而且很难做到以受控方式,因为:

  • C 标准没有定义尝试修改使用 const 定义的对象时的行为。
  • 修改可能会起作用,因为它会导致对象的某些用途发生变化,但不会改变其他用途。例如,编译器可能会将 const 对象的值构建到其他表达式中,以便在 const int a = 10; 中初始化 x。 int x = 2*a;x 初始化为 20,而根本不引用 a。如果您设法更改它,某些使用a可能会引用为其分配的内存并使用更改后的值,而a的其他用途 在同一程序中以内置方式使用原始值。显然,这会导致程序非常困惑。
  • 修改可能在一个 C 实现中“有效”,但在另一个 C 实现中失败,因为这两个实现以不同的方式管理 const 对象。
  • 修改可能看起来在您的程序中有效,但当您以明显不相关的方式更改源代码时会失败,例如插入需要编译器将一些临时值保存到堆栈的附加计算。当您更改编译器选项时,特别是当您启用优化时,您的程序也可能会失败。

在许多 C 实现中,常量全局数据存储在标记为只读的内存区域中。尝试修改它会导致异常,通常会终止您的程序。可以要求操作系统更改此保护,然后修改内存。但是,这样做会带来编译器假设常量数据不会更改而产生的副作用。

当您能够修改自动对象(例如定义的对象而不是函数体)但不能修改静态对象(例如在任何函数外部定义的对象)时,可能是因为静态对象保存有恒定的全局数据,它被标记为只读,但自动对象保留在堆栈中。堆栈包含不同内容的混合体,在当今的处理器上不可能将堆栈的一小部分标记为只读,而使其他部分可写。因此,您可能具有修改 const 自动对象的物理访问权限。但是,您仍然没有 C 标准的许可来执行此操作;该行为是未定义的,并且可能存在会破坏您的程序的隐藏副作用。

<小时/>

另外一点,const 并不总是意味着对象是常量。当使用 const定义对象时,C 标准不会定义尝试修改它的行为。但是,可以向指针添加 const 并稍后将其删除。例如,这是合法的代码:

int a = 3;
const int *b = &a;
int *c = (int *) b;
*c = 4;

这种行为是必要的,因为 C 语言最初设计时没有 const,因此它的语义并不是为了适应它而设计的,并且在某些情况下,如果 const 则事情将无法正常工作 始终被强制执行。

关于c - 是否可以更改 const 全局变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20813919/

相关文章:

我可以将 jpeg 或 mjpeg 文件从硬盘传输到 GPU 内存吗?

c++ - 存储地址以在 vector 中堆栈分配的对象

c++ - 在 C++ 中相互交换数组的部分

C编程,用指针访问字符串中的char

C:从命令行调用文件

C 数据结构理论与技术 - 同栈中的整数和字符

c - c中带 float 的模数

c - 在 C 中使用 strcmp 按字母顺序排序

c++ - C++中指向函数的指针,(*pf)() 和 pf 一样吗?

c++ - 返回值部分且确定性地变化