我正在运行以下函数:
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)
谁能解释一下发生了什么?
最佳答案
buffer 大小为 20,但是当 i 值为 9 时,您执行 sprintf(buffer + 18, "%.2X",i);
由于空字符结束而写了 3 个字符,空字符被写在 buffer + 20 处,这超出了 buffer
你需要 char *buffer = new char[n*2 + 1];
关于c++ - 为什么 sprintf 在这种情况下会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55142121/