透過非常量指針修改常數:深入研究未定義的行為
在提供的程式碼片段中,您表達了對該行為的困惑透過非常量指標(w) 修改常數整數(e):
const int e = 2;
int* w = (int*) &e; // Casting to remove const-ness
*w = 5; // Modifying the value pointed to by w
所指向的值進行此修改後,您會觀察到:
你進一步注意到,w指向的地址與e的地址相同(cout cout w 進行了修改,但 e 如何保持不變。
此行為源自於透過非修改常數時所出現的未定義行為。 -常量指針。一旦進行此類修改,程式碼就會進入未定義的行為區域,該區域變得不可預測並取決於特定的實作細節。
在這種情況下,透過w 進行的修改似乎會影響e 在運行時的臨時副本,而原始e 保持不變。原因是 e 被視為編譯時常數,並且其值被硬編碼到二進位程式碼中。因此,對 w 的任何運行時修改都不會影響原始的 e。
此行為特定於所使用的實現,不應依賴。透過非常量指標修改常數資料被認為是一種不好的做法,應該避免。正確的方法是使用非常量引用或建立要修改的資料的非常量副本。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3