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

标签 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)

谁能解释一下发生了什么?

最佳答案

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/

相关文章:

c - 具有内存重新分配结构和链表的段错误

c++ - Valgrind 声称我在使用 new 时使用 malloc

c++ - Borland 字符串::查找错误

c++ - 在成员初始化器列表中分配unique_ptr

c - 使用 valgrind 循环中的 malloc

c - getpgid 未使用 valgrind 实现

c++ - Valgrind 提示使用依赖于未初始化字节的条件跳转

c++ - 如何在构造函数中使用 unique_ptr?

C++:在控制台应用程序中禁用滚动……?

c++ - mysql c++ 连接器异常 : Access denied for user 'root' @'localhost' (using password: NO) && MySQL server has gone away