具有相同位址的變數輸出不同的值
考慮以下程式碼片段:
const int a1 = 40; const int* b1 = &a1; char* c1 = (char *)(b1); *c1 = 'A'; int *t = (int*)c1; cout << a1 << " " << *t << endl; cout << &a1 << " " << t << endl;
令人驚訝的是,這段程式碼輸出:
40 65 0xbfacbe8c 0xbfacbe8c
相同位址(c1 和t)的變數如何產生兩個不同的值('A' 和 65)?
解釋在於未定義行為的本質。在這種情況下,常數變數 (*c1) 的修改會觸發未定義的行為。根據 C 標準,未定義的行為可能會導致不可預測的結果,從程序終止到記錄的行為(有或沒有診斷訊息)。
在這個特定實例中,未定義的行為允許編譯器最佳化程式碼一種意想不到的方式。透過修改常數變量,編譯器有效地覆寫了 a1 的原始值。但是,需要注意的是,這種行為是無法保證的,並且可能會因不同的編譯器和環境而有所不同。
因此,在使用常數變數和指標時,避免修改這些變數以確保程式的可預測性至關重要行為。
以上是為什麼C語言中同一記憶體位址的變數輸出不同的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!