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

Why sprintf crash in this case?

我是运行以下函数:

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 个字符,因为结尾为 null字符,并且该空字符写入 buffer + 20 中,该字符超出 buffer

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