編譯錯(cuò)誤與運(yùn)行錯(cuò)誤
編譯錯(cuò)誤:編譯器提示的錯(cuò)誤,低級(jí)錯(cuò)誤,語(yǔ)法有錯(cuò),根本無(wú)法生成exe文件
-
運(yùn)行錯(cuò)誤:程序運(yùn)行的結(jié)果與預(yù)期不一致,說(shuō)明程序不對(duì),存在bug,需要修改
一般情況下,能復(fù)現(xiàn)的錯(cuò)誤都是可以解決的
單步調(diào)試
單步調(diào)試就是在要調(diào)試的代碼段首行加斷點(diǎn),走一步看一下結(jié)果,邊走邊觀察,直到發(fā)現(xiàn)有哪一步走錯(cuò)了
在vs環(huán)境下,斷點(diǎn)F9,單步F10,(F10是逐過(guò)程stepover,跳過(guò)函數(shù)具體執(zhí)行,F(xiàn)11是逐語(yǔ)句stepinto,可以進(jìn)入函數(shù))開(kāi)始調(diào)試F5,再按F5跳到下一個(gè)斷點(diǎn),若無(wú)下一個(gè)斷點(diǎn)則退出調(diào)試。黃色箭頭表示即將執(zhí)行這條語(yǔ)句
//求和
#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é)果是零,說(shuō)明程序有錯(cuò)。利用單步調(diào)試發(fā)現(xiàn)sum函數(shù)寫(xiě)錯(cuò)了
監(jiān)視窗口可以單獨(dú)只查看某個(gè)變量的情況。內(nèi)存窗口輸入p可以看到指針p對(duì)應(yīng)的內(nèi)存,觀看變量a的內(nèi)存時(shí)輸入&a。a=0x12345678對(duì)應(yīng)的內(nèi)存為78 56 34 12共四個(gè)字節(jié)。
程序崩潰的原因分類
一個(gè)變量未初化、未賦值,就讀取它的值。( 這屬于邏輯問(wèn)題,往往是粗心大意的導(dǎo)致的 )
-
函數(shù)棧溢出(1)定義了一個(gè)體積太大的局部變量(2)函數(shù)嵌套調(diào)用,層次過(guò)深(如無(wú)窮遞歸)
int buf[1024*1024*16]; //這個(gè)變量體積太大,應(yīng)該用malloc或new來(lái)動(dòng)態(tài)分配內(nèi)存//無(wú)窮的遞歸調(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ù)組越界訪問(wèn)
指針的目標(biāo)對(duì)象不可用,為空指針,野指針(指針未賦值,已經(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;
}