?? 前言
????hello! 各位寶子們大家好啊,上一章給大家介紹了 Visual Studio 2022功能使用,和一些常用快捷鍵!
????今天來正式來調(diào)試環(huán)節(jié),帶大家看看程序出現(xiàn)錯(cuò)誤時(shí)如何進(jìn)行調(diào)試!廢話說下面開始實(shí)踐。
????本期文章收錄在《學(xué)習(xí)工具》,大家有興趣可以看看吶!
???? 歡迎鐵汁們 ?? 點(diǎn)贊 ?? 收藏 ?留言 ??!
?? 注:前一篇文章在這里《高效調(diào)試手段與技巧(中)》
?? 一些調(diào)試的實(shí)例
?? 實(shí)例一
???? 求 1!+2!+3! …+ n! ;不考慮溢出。我們先來看一下這段代碼有什么問題?這時(shí)候我們?nèi)绻斎?,期待輸出9,但實(shí)際輸出的是15。
- 這時(shí)就要調(diào)試一下看看是哪里出現(xiàn)問題了
- 首先推測問題出現(xiàn)的原因。初步確定問題可能的原因最好。
?? 代碼演示:
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;//保存最終結(jié)果
int n = 0;
int ret = 1;//保存n的階乘
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
int j = 0;
for (j = 1; j <= i; j++)
{
ret *= j;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
?? 代碼結(jié)果:
?? 調(diào)試演示
首先我們可以確定是結(jié)果出現(xiàn)的問題,而結(jié)果又是循環(huán)來計(jì)算,我們就可以進(jìn)去循環(huán)然后把監(jiān)視窗口調(diào)開看看是不是這里的問題?
- 3的階乘應(yīng)該是 (1*1)+(1*2)+(1*2*3) =9
這里我們通過調(diào)試就可以看到,我們的循環(huán)在第三次的時(shí)候就出現(xiàn)錯(cuò)誤了。本來 ret
里面存儲的是 3
的階乘 9
可結(jié)果卻是 12
- 這里可以得出我們程序的錯(cuò)誤了
ret
這個(gè)變量未初始化導(dǎo)致結(jié)果與預(yù)想不同
?? 代碼改進(jìn):
?? 實(shí)例二(nice公司的筆試題)
前面關(guān)于我們結(jié)果與預(yù)想不一樣!如何調(diào)試這次我們來看一下 nice公司的筆試題 這道筆試題看看!
- 這道題我們該如何調(diào)試
- 看上去這個(gè)代碼沒什么問題,頂多就是多循環(huán)了一次
- 可結(jié)果卻是無限循環(huán)
?? 注:由于nice公司的筆試題,是在linux環(huán)境下的,所以博主對代碼做了一個(gè)調(diào)整讓他可以在Windows 環(huán)境下運(yùn)行。
?? 代碼演示:
本段代碼需要再Windows 環(huán)境下調(diào)位 32位機(jī)器才能運(yùn)行,否則越界容易出現(xiàn)程序崩潰!
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
?? 代碼結(jié)果:
這里就可以看到我們在死循環(huán)的打印hehe!
?? 深度解析為什么會死循環(huán) (nice公司的筆試題)
這時(shí)就要用到我們調(diào)試?yán)锩娴膬?nèi)存功能了,其實(shí)這里
筆試題
為什么死循環(huán)的原因很簡單,我們前面說過臨時(shí)變量是存在棧區(qū)
的,而棧區(qū)
的使用習(xí)慣是;
- 先使用高地址的空間在使用地地址的空間
- 所以變量
i
就在數(shù)組上面一點(diǎn)創(chuàng)建的- 那么我們就可以畫這樣一幅圖
![]()
?? 注:棧區(qū)的講解在《C/C++的內(nèi)存分布》有過詳細(xì)講解大家可以去看看!
?? 觀察內(nèi)存
我們這里就可以調(diào)試一下,觀察臨時(shí)變量 i 和臨時(shí)變量 arr 是不是在棧區(qū)是這樣存儲的!
這里為了觀察方便就把數(shù)組初始化的時(shí)候先放上值!
- 取地址 i 得到的地址是 0x00A6FBC0
- 取地址arr 得到的地址是 0x00A6FBF0
這里就可以看到我們臨時(shí)變量 arr
和 i
在內(nèi)存 棧區(qū)中地區(qū)是這樣存儲的!當(dāng)我們循環(huán)第13次時(shí) arr[13]
越界!
- 就會找到我們臨時(shí)變量
i
的地址值處從而 - 改為
0
開始無限循環(huán)
?? 總結(jié):所以我們在使用數(shù)組時(shí)一定要注意數(shù)組越界這個(gè)問題,不然就會引發(fā)bug。
??如何寫出好(易于調(diào)試)的代碼
?? 優(yōu)秀的代碼:
- 代碼運(yùn)行正常
- bug很少
- 效率高
- 可讀性高
- 可維護(hù)性高
- 注釋清晰
- 文檔齊全
??編程常見的錯(cuò)誤
?? 編程常見的錯(cuò)誤:
直接看錯(cuò)誤提示信息(雙擊),解決問題?;蛘邞{借經(jīng)驗(yàn)就可以搞定。相對來說簡單。
- 通俗的講就編譯器下面的提示
?? 編譯型錯(cuò)誤
?? 鏈接型錯(cuò)誤
看錯(cuò)誤提示信息,主要在代碼中找到錯(cuò)誤信息中的標(biāo)識符,然后定位問題所在。一般是標(biāo)識符名不存在或者拼寫錯(cuò)誤。
- 這里就是鏈接型錯(cuò)誤,一般程序會直接提示
?? 運(yùn)行時(shí)錯(cuò)誤
這個(gè)就屬于我們上面的 (nice公司的筆試題)為什么會無限循環(huán)這個(gè)就屬于運(yùn)行錯(cuò)誤!
文章來源:http://www.zghlxwxcb.cn/news/detail-615611.html
??全篇總結(jié)
? 歸納:
?? 好了以上就是關(guān)于調(diào)試給大家演示的調(diào)試實(shí)例,大家看完了也要用起來?。≈挥杏闷饋聿胖雷约赫莆樟藳]!
看到這里了還不給博主扣個(gè):
?? 點(diǎn)贊
??收藏
?? 關(guān)注
!
?? ?? ?? ?? ???? ?? ?? ?? ?? ??
拜托拜托這個(gè)真的很重要!
你們的點(diǎn)贊就是博主更新最大的動力!
有問題可以評論或者私信呢秒回哦。文章來源地址http://www.zghlxwxcb.cn/news/detail-615611.html
到了這里,關(guān)于Visual Studio 2022 程序員必須知道高效調(diào)試手段與技巧(下)終章的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!