最近在做項目中發現一個Bug,直接把進程搞死,查了一下,居然是一個最不起眼的地方導致的,在此記錄一下。
先看下面代碼
#include <iostream> #include <stdio.h> using namespace std; int main() { char aa[1024] = {0}; float f = 50.123456; // 本意是想把一個浮點數輸出到字符串中,小數位為兩位,漏了 sprintf(aa, "%0.*f", f); printf("%f\n", f); cout<<aa<<endl; sprintf(aa, "%0.*f", 2, f); cout<<aa<<endl; cout << "Hello world!" << endl; return 0; }
運行結果如下
代碼中,sprintf(aa, "%0.*f", f);是想把一個浮點數輸出到字符串中,且想控制小數點後的位數,但是在後面沒有傳參數指定小數點位數,導致sprintf打印了一長串數據到變量aa中。當aa的空間不足時,就會使得數組越界,導致程序崩潰。在項目中進程被搞死的原因就在於此。至於sprintf函數內部是怎麼打印出這麼長一串數據的,等看了源碼後再分析。