簡體   English   中英

分配不同類型的指針

[英]Assigning pointers of different types

為什么lp的初始化是非法的?

int i = 42; 
long *lp = &i;

Xcode 提示我無法使用“int *”類型的右值初始化“long *”類型的變量。

為什么?

您的 Xcode 是正確的,它們是不同的類型,這確實是非法初始化,C++ 不允許分配(或初始化)具有不同類型的指針。

也就是說,您可以顯式轉換受讓人:

int i = 42; 
long *lp = reinterpret_cast<long*>(&i);

關於你的推理,我會說這些是語言的規則,它們是為了保護你(和你的程序),而不是讓你的工作更困難,一個指向long用於操作的指針(取消引用,遞增,等)在用於存儲int的地址中將調用未定義的行為 編譯器沒有義務以相同的方式處理不同類型的指針。 可能會出現尺寸差異,alignment 等。

正如 maximum_prime_is_463035818 所述,明確強制轉換的義務試圖防止錯誤。

但是,這僅允許您編譯程序,並不能消除程序格式錯誤的可能性。

簡單的例子:

int i = 42;   

int *p = &i;    
long *lp = reinterpret_cast<long*>(&i);
long *lpc = (long*)(&i); 

std::cout << "int pointer => " << *p << "\n";   // fine, prints 42
std::cout << "long pointer => " << *lp << "\n"; // not fine, prints random vaue *
std::cout << "long pointer 2 => " << *lpc << "\n"; // not fine, same *

正如您在上面的示例中看到的,您的編譯器是正確的,這確實是一個有問題的轉換,欺騙編譯器允許轉換使程序編譯,但無法產生一致的結果。

*我也在 Windows 平台上嘗試過,結果很好,可能是因為我的平台中的long只有 4 個字節,與int相同,也許不是,關鍵是,只有當你絕對確定時才應該這樣做類型是可以互換的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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