我正在运行以下功能:
void f () {
int n = 10;
char *buffer = new char[n*2];
for(int i = 0; i < n; i++) {
sprintf(buffer + (i*2), "%.2X",i);
}
delete[] buffer;
}
在某些情况下,此功能崩溃。运行valgrind,我可以看到以下问题:
==26747== Invalid write of size 1
==26747== at 0x56CC2C9: vsprintf (in /usr/lib64/libc-2.17.so)
==26747== by 0x56AE456: sprintf (in /usr/lib64/libc-2.17.so)
任何人都可以解释发生了什么吗?
缓冲区的大小为20,但是当我的值为9时,由于结束的空字符,你执行qazxsw poi写3个字符,并且该空字符写在缓冲区+ 20,这是缓冲区之外的
你需要sprintf(buffer + 18, "%.2X",i);