笔试题――通过指针修改const变量

2014-11-24 11:53:50 · 作者: · 浏览: 1

首先我们先看一个例子:

#include 
  
   
#include 
   
     using namespace std; struct S{ const int c; //常量普通成员变量 static const int sc; //常量静态成员变量 S():c(0){ } }; const int S::sc = 0; const int gc = 0; //常量全局变量 static const int gsc = 0; //常量静态全局变量 int main() { const int lc = 0; //常量局部变量 static const int lsc = 0; //常量静态局部变量 const S ls; //局部常量结构体 int *p; p = (int *)(&ls.c); //p = (int *)(&ls.sc); //p = (int *)(&gc); //p = (int *)(&gsc); //p = (int *)(&lc); //p = (int *)(&lsc); *p += 10; cout << *p << "\t" << ls.c << endl; // 10 10 - (1) //cout << *p << "\t" << ls.sc << endl; // 段错误 - (2) //cout << *p << "\t" << gc << endl; // 段错误 - (3) //cout << *p << "\t" << gsc << endl; // 段错误 - (4) //cout << *p << "\t" << lc << endl; // 10 0 - (5) //cout << *p << "\t" << lsc << endl; // 段错误 - (6) return 0; } 
   
  

通过上例,我们可以总结出如下结论:

1. 全局const变量和static const变量由于被存放在只读的常量区,所在内存被访问时会出现段错误;

2. 局部const变量存放在可读写的栈中,可以通过指针修改其值;

3. 简单常量在编译时被作为常量展开,所以(5)中的cout << lc << endl事实上运行的是 cout << 0 << endl;而结构体的成员常量并未做此展开。