为什么在通过非常量指针变量更改常量静态变量时出现分段错误?

问题描述 投票:0回答:1
#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;
}

在这个程序中我可以理解情况1(通过将const变量的地址分配给非常量指针,我们可以改变变量值)。如果我将相同的概念应用于案例 2,我将无法工作。它给出了分段错误。是什么原因 ? case2 还有其他概念吗?这里我使用gcc编译器。

c static constants
1个回答
0
投票

尝试通过非常量指针修改

const
对象,会在程序中触发未定义的行为

这在 C 标准第 6.7.3p6 节中有详细说明:

如果尝试通过 use 修改使用 const 限定类型定义的对象 具有非 const 限定类型的左值的行为是未定义的。

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

© www.soinside.com 2019 - 2024. All rights reserved.