簡體   English   中英

關於reinterpret_cast和指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM