上一篇講了調試,今天通過一個舉例回憶一下上一篇內容吧!
1. 回顧:調試舉例
在VS2022、X86、Debug的環境下,編譯器不做任何優化的話,下?代碼執?的結果是啥?
#include <stdio.h>
int main()
{int i = 0;int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//0~9for (i = 0; i <= 12; i++){arr[i] = 0;printf("hehe\n");}return 0;
}
陷入循環
調試觀察問題:
會發現 arr 和 i 的值一模一樣,則我們對其取地址觀察:
發現地址是一樣的,所以是在這里出現了問題。
1.棧區內存的使?習慣是從?地址向 低地址使?的,所以變量i的地址是 較?的。arr數組的地址整體是? 于i的地址。
2.數組在內存中存儲的時候的特點:隨著下標的增長,數組的地址是由低到高變化的。?
所以根據代碼,就能理解為什么是左 邊的代碼布局了。
如果是左邊的內存布局,那隨著數組下標的增?,往后越界就有可能覆蓋到i,這樣就可能造成循環的。
這?為什么 i 和 arr 數組之間恰好空出來2個整型的空間呢?這?確實是巧合,在不同的編譯 器下可能中間的空出的空間??是不?樣的,代碼中這些變量內存的分配 和地址分配是編譯器指定的,所以的 不同的編譯器之間就有差異了。所以這個題?是和環境相關的。
所以代碼要進行以下修改:
所以,只有調試才能觀察到程序內部執?的細節,就像醫?給病?做B超,CT?樣。
注意:棧區的默認的使?習慣是先使??地址,再使?低地址的空間,但是這個具體還是要編譯器的 實現。
?如: 在VS上切換到X64,這個使?的順序就是相反的,在Release版本的程序中,這個使?的順序也是相反的。
(在運行時,如果進入函數沒有數組的全部內容,則需要輸入數組名+“,(查看的數組個數)”
調試過程中,要做到?中有數,也就是程序員????要清晰的知道希望代碼怎么執?,然后再去看 代碼有沒有按照我們預定的路線在執?。
調試是需要反復去動?練習的,調試是可以增加程序員對代碼的理解和掌控的,掌握了調試的能?, 就能看到本質,就像能給程序做B超?樣,對程序內部?覽?余。
2.?編譯型錯誤
編譯型錯誤?般都是語法錯誤,這類錯誤?般看錯誤信息就能找到?些蛛絲?跡的,雙擊錯誤信息也 能初步的跳轉到代碼錯誤的地?或者附近。編譯錯誤,隨著語?的熟練掌握,會越來越少,也容易解決。
3.鏈接型錯誤
看錯誤提?信息,主要在代碼中找到錯誤信息中的標識符,然后定位問題所在。?般是因為 :
標識符名不存在
拼寫錯誤
頭?件沒包含
引?的庫不存在
4.運行錯誤
?運?時錯誤,是千變萬化的,需要借助調試,逐步定位問題,調試解決的是運?時問題。
(學習內容無償分享,各位大佬覺得有幫助的話,三連哈,就是對我最大的支持!)
?