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,不出错才怪。