zoukankan      html  css  js  c++  java
  • const变量通过指针修改问题

    const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改。
    以下是VC6下才测试。
    1. 不能修改的情况
    #include 
    int const a = 10;
    void main(void)
    {
     int *p = (int*)&a;
     *p = 20;
     printf("%d
    ", *p);
    }
    程序编译通过,但运行时错误:

    指示a存储的空间不可以写,也就是没有写权限,不能修改其值。估计是存储在全局空间,且只有可读属性。
     
    2. 能修改的情况
    #include 
    void main(void)
    {
     int const a = 10;
     int *p = (int*)&a;
     *p = 20;
     printf("&a=%d
    ", &a);
     printf(" p=%d
    ", p);
     printf(" a=%d
    ", a);
     printf("*p=%d
    ", *p);
    }
    程序能正常运行,且常量被修改了,但是有一个问题:
       为什么 printf(" a=%d ", a);
       打印a=10?
    难道一个地址空间可以存储不同的俩个值,当然不能,哈哈,这是因为a是const变量,编译器对a在预处理的时候就进行了替换。编译器只对const变量的值读取一次。所以打印的是10。a实际存储的值发生了改变。但是为什么能改变呢,从其存储地址可以看出来,其存储在堆栈中。
    验证如下:
    #include 
    void main(void)
    {
     int const a = 10;
     int b = 20;
     int *p = (int*)&a;
     *p = 20;
     printf("&a=%x
    ", &a);
     printf("&b=%x
    ", &b);
     printf(" p=%x
    ", p);
     printf(" a=%d
    ", a);
     printf("*p=%d
    ", *p);
    }
    变量a和b的地址相近。

    总结,const全局变量存储在全局存储空间,其值只有可读属性,不能修改;

          const局部变量存储在堆栈中,可通过指针修改其值;

          const变量在预处理是处理,编译器只对其值读取一次。

  • 相关阅读:
    Network Flows(借助ortools)
    【转】一张图看懂IaaS, PaaS和SaaS的区别
    论文中的一些符号 O(big-Oh) Ω(big-omega) Θ(big-theta)
    最大流问题
    4 Mininet测量路径的损耗率
    3 Mininet命令延伸实验拓展
    2 Mininet可视化应用
    快速定位问题
    软中断与软中断的排查
    系统出现大量不可中断进程与僵尸进程
  • 原文地址:https://www.cnblogs.com/Zoran-/p/5819307.html
Copyright © 2011-2022 走看看