2014-10-20 132 views
0

我有以下真或假的程序C++相比,運營商沒有返回

int a = 216; 
bool* v = (bool*)((void*)&a); 
std::cout << (*v == true) << endl; 

我希望這個程序打印出真或假,而是它打印出216我與g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2編譯它。預計會出現行爲還是一些錯誤?爲什麼等號運算符會返回不同於bool的類型?

--------- ---------編輯

我的意圖不是轉換爲void而是使V存儲216在內存中的位置。替代方案可能是這樣的:

bool v; 
int a = 216; 
memcpy(&v, &a, sizeof(bool)); 
std::cout << (v == true) << endl; 

或者,我可以拿未初始化的布爾指針,它指向這恰好是例如一些隨機值

+1

'v'指向臨時(由所有演員創建),在創建它的行的末尾無效。也許讓'v'成爲'bool'不是'bool *'。請記住,'v'將始終爲真,這裏指向有效的內存位置('a'的地址)。嘗試'bool v =(&a);' – Niall 2014-10-20 12:04:14

+0

[無法重現](http://ideone.com/aTWLm8)。我沒有在'stdout'中看到'216'。 – CoryKramer 2014-10-20 12:05:27

+0

@Cyber​​你看到'0'而不是預期的'1'雖然_Horray for UB!_ – Baldrickk 2014-10-20 12:21:33

回答

5

在投射指向void*之後,您可以執行的唯一有效操作是將其轉換回原始指針類型(在您的案例中爲int*)。您將它投射到bool*雖然,這會將您帶入未定義的行爲的域。換句話說,你不能指望任何事情以某種方式發生。

您可能認爲擺脫劇組到void*將解決此問題。但是,在將其轉換爲不同的指針類型之後解引用指針也會導致未定義的行爲。

預期的輸出可以容易地實現,雖然這種方式:

bool v = (bool) a; 
std::cout << (v == true) << std::endl; 
+0

只有指向某個內存位置有216你可以試着用不同的方式來完成,例如你可以寫216到保存爲bool的內存位置,結果將是相同的。 – Trismegistos 2014-10-20 12:28:40

+0

@Trismegistos:這聽起來像是通過將'bool *'強制轉換爲'int *',然後取消引用'int *'來設置值,將一個整數值寫入'bool'變量。如果是這樣,請檢查我的答案的第二段 - 這也會導致未定義的行爲。 – 2014-10-20 12:35:37

+0

@Trismegistos:從更新到你的問題,你似乎已經使用了'memcpy'和兩種不同的指針類型。基於同樣的原因,這又是一次未定義的行爲:您試圖將「int」值視爲「bool」值。不要試圖繞過類型安全 - 沒有什麼好的可以來。 – 2014-10-20 12:45:35

0
int a = 216; 
bool* v = (bool*)((void*)&a); 
std::cout << (*v == true) << endl; 

一個= 216 = 128 + 64 + 16 + 8 = 00000 ... 11011000

* V = 1000如果我們打印出來,那就說明真的...

但真正= 0001,它是不是滿足* v ==真

當然是有點GUE中我的實驗後,SS ...

多虧了你之後,我一直使用的東西!=假的東西,而不是真正的== ...

什麼==假的,而不是其他!=真...