相同的地址显示了使用g ++编译器的const变量的不同值

Rah*_*tam 2 c c++

以下代码显示了使用const变量时gcc和g ++的不同输出i.的地址i和值ptr是相同的,但上通过印刷的值访问该地址i和derefrencing的值ptr我得到的值i作为5与g ++以及10用gcc.

g ++如何在内存中保存const变量?

   #include <stdio.h>
   int main()
   {
     const  int i =5; 
     int *ptr =(int*)&i;
     *ptr = 10;
     printf("\n %u and %u   and %d  and %d  \n",&i,ptr,i,*ptr);

     return 0;
   }
Run Code Online (Sandbox Code Playgroud)

und*_*gor 8

您正在修改const限定对象.这在C中是不允许的("未定义的行为").任何事情都可能发生.

例子:

  1. 编译器可以放入i只读内存.写入*ptr将使您的程序崩溃.
  2. 它可以把它放入可写的内存中,你只会看到10.
  3. 它可以把它放入可写的内存中,但用i5号替换所有读访问(你答应过const,不是吗?).

我猜C编译器选择2而C++编译器选择3.


Nia*_*all 5

其他人评论了代码正在做什么的"未定义"性质.但是要解释这是如何发生的,完全有可能编译器应用了一个优化,而运行时的值i永远不会传递给它printf,而是替换i为常量5.你确实声明它const是不应该改变的.