關於變數定義的古怪bug

2021-08-15 18:07:55 字數 555 閱讀 5758

今天除錯了乙份以前寫的code,用的c。

問題相當之古怪,最後的結果也令人驚訝。

簡單來說,兩個部分,乙個檔案解析,乙個具體動作。檔案解析把結果打包交給動作部分執行。從功能上講,檔案解析出來的內容對於動作模組是黑盒,也就是無論解析出來的內容是什麼,對還是錯,對於動作模組是沒有影響的。校驗適量乙個部分做的。

但是這裡出現了問題,當解析部分新增了乙個option內容後,在某些情況下動作模組無法執行了。

在排除了記憶體溢位,陣列越界等等可能的問題後,我們真的覺得見鬼了。

最後用最笨的辦法,一行行的注釋,最後定位到乙個奇怪的地方。

就是最標準的for迴圈,但是不是迴圈體出錯,而就是

for(i = 0;i改正很簡單,但是為什麼錯了,真是難以理解。

折騰了半天,終於發現,這個i在某些情況下會被改掉(難以理解的詭異情況,這個i在函式體裡定義,函式其他地方沒有用),而把i的定義不放在函式體的頭部,而是寫成for( int i = 0;i這真是百思不得其解,雖然想深究下去,但是問題已經解決了,**也不是我在維護了,很難重現這個現象了。只好做個mark,以防以後掉到坑里都不知道怎麼爬出來。

乙個古怪的bug除錯過程

也許這也不能算是乙個bug,只不過沒有了解清楚乙個函式的確切用法罷了。這一切都源於乙個經典的程式 include include int main void return 0 當我輸入abcd n 的時候,輸出是abcd n 這很正常 當我輸入ctrl d 也就是eof 結束程式,這也很正常 但是,...

關於定義變數的技巧

1.全域性變數 眾所周知,全域性變數應該是得到記憶體分配且可以被其他模組通過c語言中extern關鍵字呼叫的變數。因此,必須在 c和 h 檔案中定義。這種重複的定義很容易導致錯誤。以下討論的方法只需用在標頭檔案中定義一次。雖然有點不易懂,但一旦掌握,使用起來卻很靈活。如下定義出現在定義所有全域性變數...

關於變數的宣告和定義

變數的宣告與定義的區別 變數的宣告有兩種情況 1 一種是需要建立儲存空間的。例如 int a 在宣告的時候就已經建立了儲存空間。2 另一種是不需要建立儲存空間的。例如 extern int a 其中變數a是在別的檔案中定義的。前者是 定義性宣告 defining declaration 或者稱為 定...