C 常見錯誤

2021-04-13 11:26:04 字數 3267 閱讀 2910

1.用malloc或farmalloc動態分配記憶體時,如

char *buffer;

buffer=(char *)malloc(300);

因為並不是在所有的情況下,都會分配成功

所以應加 if(buffer==null)

2.char far *buffer;

buffer=(char far *)farmalloc(size);

當size的值大於64k時,很可能不會分配成功,

但是不會返回null,很容易出錯。

因此最好size的值最好不要大於64k

3.char 的取值範圍為 0-127

unsigned char 的取值範圍為0-255

新手常常在使用char時,出錯,比如說,

在256色的螢幕模式下,顏色索引值為0-255,

而很多新手用 char color,這樣會出錯。

4.程式設計時常會對鍵盤進行處理

key=bioskey(1);

用bioskey(1)時,程式從緩衝區取乙個鍵,但是不

會把這個鍵從緩衝區移走,因此key的值將永遠保持不變

5.用if(bioskey(1)!=0) key=bioskey(0);

這樣按鍵時,會從緩衝區移走乙個鍵。

但是當不按鍵時,key的值將保持不變,直到按下一鍵為止

因此應加 else key=0;

6.使用textcolor(int newcolor);

和textbackground(int newcolor);

這兩個函式來改變字元顏色和背景色時,

用stdio.h中的printf,puts等向螢幕輸出的函式是,並不能

按textcolor(int),textbackground(int)這兩個函式所要求的顏色來顯示。

用該用conio.h中的cprintf,cputs等函式

7.printf("/n");游標會在螢幕上換行並移動到第一列。

但cprintf("/n");不會,printf是標準輸出函式,與dos相關

dos會自動把'/n'處理成'/n'和'/r',而cprintf是控制台級函式,不會這樣

因此應該用cprintf("/n/r");

8.float a=1.9;

if(a==1.9) printf("ok");

執行時卻不會顯示ok;

不要用float型數字進行關係運算中的等於運算

改為double雙精度型即可解決問題.

9.在tc2.0中

main()

這樣編譯時不會出錯

但是在有些c語言版本中,系統會自動當作

int main()

而顯示"..should return a value "

10.float a;

a=1/2;

printf("%f",a);

執行的結果是0.000000,而不是0.500000.

因為/號兩邊的數字是1和2,系統會當作整型處理,因此出

現這種情況,解決辦法是改為 a=1.0/2 或 a=1/2.0 或 1.0/2.0

11.乙個函式

char *buf()

因為系統在呼叫完函式時,會自動釋放為str 開闢的空間,

因此 return data無意義

12.對於findfirst(char *name,struct ffblk,int attrib);

findnext(struct ffblk);

當尋找目錄時,用findfirst("*.*",&ffblk,fa_direc);

雖然所找檔案的屬性為目錄,但是會將當前目錄下的所有檔案找出來

用findfirst("*.",&ffbli,fa_direc)時,找出來的是目錄以及沒有擴

展名的檔案。

13.看下面乙個函式

/*640x480x256*/

void plot(int x,int y,unsigned char color)

看似沒有錯誤,但是對於offest=(y-1)*640+x-1這句,

雖然offest是長整型,但是y是短整型,在計算(y-1)*640時,系統

會按短整型處理,當y的值取110以上時,(y-1)*640的值顯然會超出

短整型數字的取值範圍,從而產生錯誤,因此應改為

offest=(long int)(y-1)*640+x-1;

14.對於乙個陣列 int data[5][4];

data表示data[0][0]的位址

data[2]表示data[2][0]的位址

因此有人認為data[4][2]的位址可表示為

(1).data+4*4+2;

(2).data[4]+2;

其中(2)是正確的,而(1)卻是錯誤的.

因為data的基型別是8個位元組的,

data+4表示的就是data[4][0]的位址

data+1表示的就是data[1][0]的位址

15.許多人認為轉義字元'/64'中的64是十進位制數,

但實際上這個64是八進位制數,這個八進位制數前面可以加0也可不

加0,當然轉義字元/後面也可以用十六進製制數,但要

用'/x..'或'/x..'的形式,如'/x14'。

16.看下面這個程式

#include

void display(int data,int num)

void main()

;display(da,10);  

}一般認為當程式裡呼叫這個函式時,系統會為形參data開闢乙個

10個整型數字的儲存空間,實際上,這個函式只為data開闢乙個整型指標型別的空間,

使用指標指向data的首位址,因此在display(int data,int num)這個函式中,

若使用賦值語句對陣列data的某項賦值,如data[0]=2,會使主程式中的陣列da的值改變.

17.void main()

}在編譯時,會出現警告。

在tc2.0中,若改為index<=255,編譯會通過,但是執行程式時

卻會陷入死迴圈,大家不禁會產生疑問,unsigned char型別資料的

取值範圍為0-255,為什麼上述程式會出現錯誤呢。

讓我們先看下面乙個程式:

void main()

printf("%d",i);

}執行結果為10,當i=9的迴圈完成後,i自加1,使得i=10,這時不符合

i<10,才跳出迴圈,因此執行結果為10;

同理,若改為i<=10;則執行結果為11。

通過這個程式,應該能明白為什麼前乙個程式會出錯了。

c常見錯誤

11.error c2017 illegal escape sequence 中文對照 轉義字元非法 分析 一般是轉義字元位於 或 之外,例如 char error n 12.error c2018 unknown character 0xhh 中文對照 未知的字元0xhh 分析 一般是輸入了中文標...

C語言 常見錯誤

1.忘記定義變數。2.輸入輸出的資料的型別與所用格式說明符不一致。3.未注意 型資料的數值範圍。4.在輸入語句scanf中忘記使用變數的位址符。5.輸入資料的形式與要求不符。6.誤把 作為 等於 運算子。7.語句後面漏分號。8.在不該加分號的地方加了分號。9.對應該有花括號的復合語句,忘記加花括號。...

C語言 常見錯誤

1 char p 注意p中包含字串結束符 0 2 strlen函式沒有包含字串末尾的 0 3 如果函式的引數是乙個指標,不要指望用該指標去申請動態記憶體 4 createnode binnode tree,char p 訪問tree.data錯誤 原來問題出在c編譯器原理上 編譯器總是要為函式的每個...