代码之家  ›  专栏  ›  技术社区  ›  Shweta

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

  •  26
  • Shweta  · 技术社区  · 15 年前
    #include <stdio.h>
    int main()
    {
        const int a = 12;
        int *p;
        p = &a;
        *p = 70;
    }
    

    10 回复  |  直到 9 年前
        1
  •  33
  •   Crashworks    15 年前

    这是“未定义的行为”,也就是说,根据标准,你无法预测当你尝试这种方法时会发生什么。根据特定的机器、编译器和程序状态,它可以做不同的事情。

    但是在某些情况下——最典型的是 const static

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

        2
  •  14
  •   JeremyP    15 年前

    这是不确定的行为。证明:

    /* program.c */
    
    int main()
    {
            const int a = 12;
            int* p;
            p = &a;
            *p = 70;
            printf("%d\n", a);
            return 0;
    }
    
    
    gcc program.c
    

    然后运行它。输出为70(gcc 4.3)

    gcc -O2 program.c
    

        3
  •  11
  •   Michael F    6 年前

    修改 const 通过指针限定的对象调用未定义的行为,结果就是这样。它可能是您对特定实现的期望值,例如,如果将其放置在 .text 等等。

        4
  •  6
  •   Alexander Sagen    15 年前

    它确实与gcc一起工作。但它不喜欢:

    test.c:6:警告:赋值将丢弃指针目标类型的限定符

    但执行时值确实发生了变化。我不会指出明显的不-不。。。

        5
  •  4
  •   Jokester    15 年前

    是的,你可以用这样的代码来完成。但当 a 是全局的(一个gcc编译的程序给了我 segmentation fault .)

    一般来说,在心爱的C中,你几乎总能找到一些方法来破解那些不应该被改变或暴露的东西。这里的const就是一个例子。

        6
  •  1
  •   Hemant    15 年前

    这里是指针的类型 p int* ,正在为其指定类型的值 const int* ( &a const int

    隐式cast消除了常量,尽管gcc抛出了一个警告(请注意,这在很大程度上取决于实现)。

    因为指针没有声明为 const ,可以使用该指针更改值。

    如果指针声明为 const int* p = &a ,你就做不到了 *p = 70

        7
  •  1
  •   ad absurdum    6 年前

    此代码包含 :

    const int a = 12;
    int *p;
    p = &a;
    

    违反的约束是C116.5.16.1/1“简单赋值”;如果两个操作数都是指针,则左侧指向的类型必须具有右侧指向的类型的所有限定符。(类型sans限定符必须兼容)。

    &a 有类型 const int * ,它有 const 作为限定符;但该限定符不出现在 p 哪个是 int *

    编译器必须发出诊断,并且可能不会生成可执行文件。任何可执行文件的行为都是完全未定义的,因为程序不符合语言的规则。

        8
  •  0
  •   Abhijeet Pathak    15 年前

    Pointer to a constant .

    Constant Pointer . 这意味着一旦指针指向一个内存位置,就不能使它指向另一个位置。

        9
  •  0
  •   3Dave    15 年前

    而且,行为是特定于平台和实现的。如果您运行的平台上的常量存储在不可写内存中,这显然行不通。

    你到底为什么要这么做?要么更新源中的常量,要么使其成为变量。

        10
  •  -3
  •   Vineet Jain    8 年前

    是的,您可以更改常量变量的值。

    #include <stdio.h>
    
    int main()
    {
        const  int x=10;
    
        int *p;
        p=(int*)&x;
        *p=12;
        printf("%d",x);
    }
    
    推荐文章