为什么在这种情况下sprintf崩溃?

时间:2019-03-13 12:37:50

标签: c++ valgrind

我正在运行以下功能:

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)

任何人都可以解释发生了什么事吗?

1 个答案:

答案 0 :(得分:3)

缓冲区的大小为20,但是当 i 的值为9时,您会sprintf(buffer + 18, "%.2X",i);写3个字符,因为结尾是空字符,并且该空字符被写入位于 buffer

之外的 buffer + 20

您需要char *buffer = new char[n*2 + 1];