我们可以通过指针改变一个用const定义的对象的值吗?

标签 c constants undefined-behavior

#include <stdio.h>
int main()
{
    const int a = 12;
    int *p;
    p = &a;
    *p = 70;
}

它会起作用吗?

最佳答案

这是“未定义的行为”,意思是根据标准,您无法预测尝试此操作时会发生什么。根据特定的机器、编译器和程序的状态,它可能会做不同的事情。

在这种情况下,最常发生的情况是答案是"is"。变量,无论是否为常量,都只是内存中的一个位置,您可以打破常量规则并简单地覆盖它。 (当然,如果程序的某些其他部分依赖于其 const 数据是常量,这将导致严重的错误!)

但是在某些情况下——最典型的是 const static 数据——编译器可能会将此类变量放在内存的只读区域中。例如,MSVC 通常将 const static int 放在可执行文件的 .text 段中,这意味着如果您尝试写入它,操作系统将抛出保护错误,程序将崩溃。

在编译器和机器的其他一些组合中,可能会发生完全不同的事情。您可以肯定地预测到的一件事是,这种模式会惹恼任何必须阅读您的代码的人。

关于我们可以通过指针改变一个用const定义的对象的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3801557/

相关文章:

c - 使用常量定义的位数

c - 如何在没有中间副本的情况下在标准 C 中实现 memmove?

具有静态和指针的 C 代码

c - 我应该如何用 C 构建复杂的项目?

c++ - PyImport_AppendInittab 怎么会失败?

c++ - C++ 中的静态结构

c++ - 从 C++ 文件中读取后,如何将常规字符串数组转换为 const 字符串数组?

c - 使用 makefile 在 C 中处理 #include <folder/file.h>

c - 使用二分查找查找已排序字符串中的第一个大写字母

c - C 编程中未知边界用法的数组