sprintf_s 是個比sprintf更安全的函數,今天在使用的過程中犯了個錯誤,代碼的大致意思如下
1 void Test_sprintf_s() 2 { 3 char buff[64]; 4 5 memset(buff, 0, sizeof(buff)); 6 7 sprintf_s(buff, sizeof(buff), "AAAAAA-"); 8 9 sprintf_s(buff+strlen(buff), sizeof(buff), "BBBBBBB-"); 10 11 }
上面的第9行犯了個錯誤,相信你也能看出來。
奇怪的是在Release版本下沒有問題,Debug下才會導致崩潰,並出現下述提示:
研究下來,發現sprintf_s執行后,會把整個緩沖區的尾部填滿 0xFE。如下圖:
毫無疑問,執行到代碼第9行,buff后的內存也被錯誤的填寫了0xfe,不出錯才怪。