Почему сбой sprintf в этом случае? - PullRequest
0 голосов
/ 13 марта 2019

Я использую следующую функцию:

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 Ответ

3 голосов
/ 13 марта 2019

буфер имеет размер 20, но когда i значения 9, вы делаете sprintf(buffer + 18, "%.2X",i); запись 3 символов из-за завершающего нулевого символа, и этот нулевой символ записывается в буфер + 20 который находится вне буфер

вам нужно char *buffer = new char[n*2 + 1];

...