const int *ptr=500; // WRONG
這聲明瞭一個局部變量,它是一個指向某個常量整數的指針。 const
只是告訴編譯器它不允許更新(覆蓋)解引用的指針內存單元。
但是,您的代碼不正確;您可能想要:
const int *ptr = (const int*)500;
指針初始化爲address 500(您初始化指針)。
在大多數系統中,該地址(以及後面的地址,例如自sizeof(int)
起的地址504是4)不在virtual address space之中。所以解引用它(與*ptr
)是undefined behavior,並且往往會給一些segmentation fault。另請參閱this。
ptr將存儲在讀寫部分(堆棧)中,並且對象或實體將存儲在數據分段的只讀部分。
這是錯誤的。編譯時沒有做任何事情來將內存區保持在只讀text segment(但是,大多數編譯器將大部分文字或const
靜態或全局數據在編譯時定義在其中)。只是你禁止編譯器更新指向的東西(沒有強制轉換)。
如果您在運行時需要只讀內存區域,則需要詢問您的操作系統(例如在Linux上使用mmap(2) & mprotect(2))。 BTW保護工作在pages。
在Linux上,使用pmap(1)(或proc(5),例如,從您的程序中按順序讀取僞文件/proc/self/maps
)。您可能需要的ptr
任何非關聯化之前添加
char cmdbuf[64];
snprintf(cmdbuf, sizeof(cmdbuf), "pmap %d", (int) getpid());
system(cmdbuf);
在你的代碼要明白什麼是它的虛擬地址空間。
嘗試
cat /proc/self/maps
和
cat /proc/$$/maps
,並瞭解它們的輸出(注意$$
擴展到你的shell的PID)。也許你也在你的錯誤程序上試驗strace(1)(你應該用gcc -Wall -g
編譯)。
[應該密切相關](http://stackoverflow.com/a/43338131/2173917) –
'const int * ptr = 500;'是標準C中的約束違規。gcc編譯器的行爲就像您寫'const int * ptr =(const int *)500;'如果您在標準兼容模式下調用編譯器,它將發出診斷信息。 –
「o/p」是什麼意思? –