如果是局部自動變量 加了 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宏(因爲它存儲於只讀數據區),每次對它的引用都會到相應的內存區域讀取,因此程序崩潰(對只讀存儲區修改當然會引起程序崩潰)
}