[英]About reinterpret_cast and pointer
我正在學習C和C ++。 在這個計划中:
#include <iostream>
int main() {
const int g = 10;
int * k = reinterpret_cast <int *> (20000); //ok
std::cout << "k : " << k << std::endl;
std::cout << "* k : " << * k << std::endl;
* k = g;
std::cout << "* k : " << *k << std::endl;
return 0;
}
./converForTyEn
k:0x4e20分段錯誤(核心轉儲)
我希望20000然后是10.但似乎錯誤是“意味着你試圖訪問你無法訪問的內存。” (Erci Finn)。 謝謝你的幫助。
該標准的工作草案(N4713)陳述了關於使用的標准
8.5.1.10重新解釋強制轉換
...
5. 可以將整數類型或枚舉類型的值顯式轉換為指針 。 轉換為足夠大小的整數(如果實現上存在任何此類)並返回相同指針類型的指針將具有其原始值; 指針和整數之間的映射在其他方面是實現定義的。 [注意: 除6.6.4.4.3中描述的情況外,這種轉換的結果不是安全派生的指針值 。 - 尾注]
和:
6.6.4.4.3安全派生指針[basic.stc.dynamic.safety]
...
2. 指針值是指向動態對象的安全派生指針,只有它具有對象指針類型且它是以下之一 :
(2.1) - 調用:: operator new(std :: size_t)或:: operator new(std :: size_t,std :: align_val_t)的C ++標准庫實現返回的值;
(2.2) - 通過安全導出的指針值獲取由間接導致的左值指定的對象(或其子對象之一)的地址的結果;
(2.3) - 使用安全派生的指針值定義良好的指針算法的結果;
(2.4) - 安全派生指針值的明確定義的指針轉換結果;
(2.5) - 安全派生指針值的reinterpret_cast的結果;
(2.6) - 對安全派生的指針值的整數表示的reinterpret_cast的結果;
(2.7) - 從可跟蹤指針對象復制其值的對象的值,其中在復制時源對象包含安全派生的指針值的副本。
由於您在整數文字( 20000
)上使用reinterpret_cast
,因此轉換的結果不是安全派生的指針值。 嘗試取消引用此類指針值會導致未定義的行為。
指針必須指向要使用的有效內存。 在您的情況下,您將其設置為任意內存位置,20000。
有效指針使用的一個例子是
int x = 42;
int *px = &x;
這將x
的地址放入px
。
std::cout << px;
會輸出地址。
std::cout << *px;
會輸出x
的值。
您的代碼調用未定義的行為(UB),可能的輸出將是:
k : 0x4e20
Segmentation fault
其中第一行是k
的地址。 然后,在這行代碼中:
std::cout << "* k : " << * k << std::endl;
您正在嘗試訪問此地址,該地址不在您的程序段中,從而導致分段錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.