程序筆試題-const變量通過指針修改問題

const的變量在特定情況下可以通過指針修改,但是在另一些情況下是不能通過指針修改。
以下是VC6下才測試。
1 不能修改的情況
#include 
int const a = 10;
void main(void)
{
 int *p = (int*)&a;
 *p = 20;
 printf("%d\n", *p);
}
程序編譯通過,但運行時錯誤:
指示a存儲的空間不可以寫,也就是沒有寫權限,不能修改其值。估計是存儲在全局空間,且只有可讀屬性。
 
2 能修改的情況
#include 
void main(void)
{
 int const a = 10;
 int *p = (int*)&a;
 *p = 20;
 printf("&a=%d\n", &a);
 printf(" p=%d\n", p);
 printf(" a=%d\n", a);
 printf("*p=%d\n", *p);
}
程序能正常運行,且常量被修改了,但是有一個問題:
   爲什麼 printf(" a=%d\n", 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\n", &a);
 printf("&b=%x\n", &b);
 printf(" p=%x\n", p);
 printf(" a=%d\n", a);
 printf("*p=%d\n", *p);
}
變量a和b的地址相近。

總結,const全局變量存儲在代碼區,其值只有可讀屬性,不能修改;

      const局部變量存儲在堆棧(棧)中,可通過指針修改其值;

      const變量在預處理時處理,編譯器只對其值讀取一次。

 

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