C 中的無限輸出循環
在提供的C 程式碼中,發生意外的無限循環,列印一系列連續的數字( 「0 , 1, 2, 3, 4, 5, ...」)而非預期的「0, 1, 2, 3」。
仔細檢查揭示了罪魁禍首是循環中看似無害的賦值語句「delta = mc[di]」。此賦值會觸發未定義的行為,因為它在最後一次迭代時越界存取 mc 陣列(即「di = 4」)。
在積極的循環最佳化下,編譯器可能會假設不存在未定義的行為。因此,它透過消除 di
為了確保正確的行為,避免未定義的行為至關重要,即使在優化的程式碼中也是如此。在這種情況下,解決方案是確保在循環內的範圍內存取 mc。
另一種方法是使用 gcc 中的 -fno-aggressive-loop-optimizations 標誌來停用激進的循環優化。此標誌強制編譯器保留 di
透過理解未定義行為的潛在後果並採取適當的措施來避免它,程式設計師可以確保他們的 C 代碼的可靠性和正確性。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3