編譯錯誤與運行錯誤
編譯錯誤:編譯器提示的錯誤,低級錯誤笑跛,語法有錯,根本無法生成exe文件
-
運行錯誤:程序運行的結(jié)果與預(yù)期不一致聊品,說明程序不對飞蹂,存在bug,需要修改
一般情況下翻屈,能復(fù)現(xiàn)的錯誤都是可以解決的
單步調(diào)試
單步調(diào)試就是在要調(diào)試的代碼段首行加斷點陈哑,走一步看一下結(jié)果,邊走邊觀察伸眶,直到發(fā)現(xiàn)有哪一步走錯了
在vs環(huán)境下惊窖,斷點F9,單步F10厘贼,(F10是逐過程stepover界酒,跳過函數(shù)具體執(zhí)行,F(xiàn)11是逐語句stepinto嘴秸,可以進(jìn)入函數(shù))開始調(diào)試F5毁欣,再按F5跳到下一個斷點,若無下一個斷點則退出調(diào)試岳掐。黃色箭頭表示即將執(zhí)行這條語句
//求和
#include<stdio.h>
int sum(int* buf,int n)
{
int total = 0;
for(int i=0;i<total;i++)
{
total+=buf[i];
}
return total;
}
int main()
{
int buf[64];
for(int i=0;i<64;i++)
{
buf[i]=i;
}
int result = sum(buf,64);
printf("%d\n",result);
return 0;
}
程序結(jié)果是零凭疮,說明程序有錯。利用單步調(diào)試發(fā)現(xiàn)sum函數(shù)寫錯了
監(jiān)視窗口可以單獨只查看某個變量的情況串述。內(nèi)存窗口輸入p可以看到指針p對應(yīng)的內(nèi)存执解,觀看變量a的內(nèi)存時輸入&a。a=0x12345678對應(yīng)的內(nèi)存為78 56 34 12共四個字節(jié)剖煌。
程序崩潰的原因分類
一個變量未初化材鹦、未賦值,就讀取它的值耕姊。( 這屬于邏輯問題桶唐,往往是粗心大意的導(dǎo)致的 )
-
函數(shù)棧溢出(1)定義了一個體積太大的局部變量(2)函數(shù)嵌套調(diào)用,層次過深(如無窮遞歸)
int buf[1024*1024*16]; //這個變量體積太大茉兰,應(yīng)該用malloc或new來動態(tài)分配內(nèi)存
//無窮的遞歸調(diào)用 #include <stdio.h> #include <stdlib.h> void a(); void b(); void a() { printf("Calling a() ...\n"); b(); } void b() { printf("Calling b() ...\n"); a(); } int main() { a(); return 0; }
數(shù)組越界訪問
指針的目標(biāo)對象不可用尤泽,為空指針,野指針(指針未賦值,已經(jīng)free/delete了卻還要用坯约,不恰當(dāng)?shù)闹羔槒?qiáng)制轉(zhuǎn)換要求)
//野指針:不恰當(dāng)?shù)膹?qiáng)制轉(zhuǎn)換
#include <stdio.h>
int main()
{
int a = 10;
double* p = (double*) &a;
*p = 123.345; // 程序崩潰
return 0;
}