最近在做項目中發現一個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函數內部是怎麼打印出這麼長一串數據的,等看了源碼後再分析。