由EOF和NULL引起的乙個C程式的分析

2021-04-09 08:54:55 字數 1936 閱讀 1466

看乙個程式,這個程式在執行時會出現無限迴圈:

#include

#include

void

main()

分析:

1.這個程式在執行會出現死迴圈,因為檔案結尾會返回

eof=-1

,而null

被定義為0或

0l或

((void *)0)

,所以正確的

null

改為eof

。參考:

在/vc7/include/stdio.h中

/* define null pointer value */

#ifndef

null

#ifdef

__cplusplus

#define

null0

#else

#define

null((void *)0)

#endif

#endif

/**/

#define

eof(-1)

/tc/include/stdio.h中

/**/

#ifndef

null

#if

defined(__tiny__) || defined(__**all__) || defined(__medium__)

#define

null0

#else

#define

null

0l

#endif

#endif

/* end-of-file constant definition

*/

#define

eof(-1)

/* end of file indicator */

2.

在tc2.0

、tc3.0

和vc7.0

中單步除錯**時可以設定觀察變數c和

(int)c

,可以發現遇到回車換行符是讀出的

c=』/n』

,(int)c=10

,即ascii

中的lf(line feed)

,且僅僅是乙個

lf字元,沒有

cr (13)

字元,這在寫給文字加解密的程式時時要注意的,大二時寫過對txt檔案用異或演算法加解密的程式,但是後來卻發現解密(還原)後的檔案有亂碼,其實就是對回車換行符處理出了錯誤。 3.

遇到eof

字元時結果有些不同: c

(int)c

tc2.0

『 『

-1

tc3.0

『 『

255

vc7.0

『 『

-1

由此可以看出,在三種環境中

char

型別有類似如下的定義

tc2.0

#define

char

signed

short

tc3.0

#define

char

unsigned

short

vc7.0

#define

char

signed byte

4.getc

不可能返回

null(0)

字元。5.

此程式的最開始版本是

#include

#include

void

main()

這樣的話程式更容易出錯,因為

boldfaced

**行出現無限迴圈時,陣列

a會出現越界,而

c/c++

沒有陣列越界檢查,這樣會造成記憶體的錯誤使用而使程式非法終止。

由框架中乙個BUG引起的

今天加班在給new guys做培訓的時候,發生了乙個莫名其妙的問題,幾經周折,才發現是公司現有框架的乙個bug。xml converter valueobject objectid lib class com.icsc.tm.mscdao.tmjcs03vo type unique converte...

乙個由有符號下標引起的bug

先看段 if s d i 這裡的d是乙個char 的記憶體buffer,s是乙個256長度的bool陣列。上段 邏輯是,s已進行過初始化,其作用是過濾位元組,有些位元組對應true,有些位元組對應false。明顯,d i 有256種可能。上面的邏輯正確麼?上面的 其實就是我專案裡的一段 看似沒有問題...

由乙個聚焦 focus 事件異常跟蹤引起的總結

測試同學提了乙個問題,問題的具體現象為 乙個dialog出現後,其中的input內容有聚焦,但是確不能通過tab移動到下乙個input輸入框 我感覺也很是奇怪,但是只要用滑鼠點選dialog浮層的任何乙個位置就可以進行正常的操作了 通過tab進行input的移動 奇怪的是,我如果不用滑鼠點選的情況下...