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