看乙個程式,這個程式在執行時會出現無限迴圈:
#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的移動 奇怪的是,我如果不用滑鼠點選的情況下...