const類型變量的內存分配

如果是局部自動變量 加了 const 只是起了個標記的作用,變量還是分配在棧區
如果是全局變量,就會分配在只讀數據段,也就是常量區
程序驗證如下: 
  
#include  <iostream>
using namespace std;


const int g_c = 0;          //如果是global變量的話確實是分配在常量區  
int g_a;
int main()
{
     int  a = 0; 

     const int c = 0; 

     char * str = "test";  
      
     cout<<&a<<endl;       //分配在棧  

     cout<<&c<<endl;       //分配在棧 雖然是 const ,可以看到 const 只是起了一個標記的作用  

     cout<<&g_c<<endl;     //全局只讀數據區 (也就是常量區吧)  

     cout<<(int*)str<<endl;//分配在全局只讀數據區 (字符串常量)  


     cout<<&g_a<<endl;     //分配在全局數據區  
      
      
     int * P = (int *)&c;
     *P = 1;               // 運行沒問題  
      
     cout<<c<<endl;        //這裏輸出還是 0,而不是1!!! 可能的解釋是const局部變量的作用類似於define宏,每次引用c值,編譯器並不是到棧內存中取值(該程序中棧內存中的值確實被改變了),而是直接用常量代替const變量(與編譯器對define宏的處理一致)。
       
     P = (int *)&g_c;
     *P = 1;               //程序崩潰!!!可能的解釋是編譯器對全局常量的處理完全不同於define宏(因爲它存儲於只讀數據區),每次對它的引用都會到相應的內存區域讀取,因此程序崩潰(對只讀存儲區修改當然會引起程序崩潰)
  
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章