#include <stdio.h>

int main() {
    // case 1
    const int a = 10;
    int * ptr1 = &a;
    *ptr1 = 11;
    printf("%d\n",*ptr1);
    
    // case 2
    const static int b = 10;
    static int * ptr2 = &b;
    *ptr2 = 11;
    printf("%d\n",*ptr2);
    return 0;
}

在这个程序中,我可以理解第一种情况(通过将const变量的地址分配给非常数指针,我们可以更改变量值).如果我把同样的概念应用于 case 2,我就不会工作了.给出了分段故障.原因是什么?对于 case 2还有其他的概念吗?这里我用的是GCC编译器.

推荐答案

如果试图通过非常数指针修改const对象,则会在程序中触发undefined behavior.

这在第C standard条的第6.7.3p6节中详细说明:

如果试图通过使用修改常量限定类型定义的对象 对于具有非常量限定类型的左值,行为未定义.

当你的程序中有未定义的行为时,不能保证它会做什么. 它可能会崩溃(如第二种情况),可能会给出奇怪的结果,或者可能看起来工作正常(如第一种情况).

因此,这两种情况都有未定义的行为.它们只是表现得不同而已.

C++相关问答推荐

了解一些CLIPS原语数据类型

字符串令牌化xpath表达式

C语言中字符数组声明中的标准

GCC引发不明确的诊断消息

减法运算结果的平方的最快方法?

Win32API Wizzard97 PropSheet_SetWizButton不工作

当输入负数时,排序算法存在问题

X64:并发写入布尔数组

等同于铁 rust 的纯C语言S未实现!()宏

C:在编译时构建和使用字符串文字的预处理器宏?

使用C++中的字符串初始化 struct 时,从‘char*’初始化‘char’使指针变为整数,而不进行强制转换

为什么我无法访问C语言中的文件

无算术运算符和循环的二进制乘法

Ubuntu编译:C中的文件格式无法识别错误

为什么写入关闭管道会返回成功

传递参数:C 和 C++ 中 array 与 *&array 和 &array[0] 的区别

malloc:损坏的顶部大小无法找出问题

nullptr_t 是否会 destruct 类型双关或指针转换?

我怎样才能用c语言正常运行这两个进程?

如何让 unlinkat(dir_fd, ".", AT_REMOVEDIR) 工作?