WriteConsoleOutputA的奇怪输出

时间:2015-01-19 13:39:19

标签: c++ winapi memory console stdvector

我尝试使用WriteConsoleOutputA()std::vector<CHAR_INFO>在Win32控制台中打印颜色模式;一切似乎都好。但是当我尝试使用2维向量std::vector<std::vector<CHAR_INFO>>时,WrtieConsoleOutputA()会在输出中获取一些内存容器。我不知道我的代码中的错误在哪里。

这是我的代码:

#include <ctime>
#include <Windows.h>
#include <vector>

int main()
{
    srand((unsigned)time(NULL));
    const int width = 80, height = 25;
    COORD charBufferSize{ width, height };
    COORD characterPosition{ 0, 0 };
    SMALL_RECT writeArea{ 0, 0, width - 1, height - 1 };
    std::vector<std::vector<CHAR_INFO>> backBuffer(height, std::vector<CHAR_INFO>(width));

    for (auto& i : backBuffer)
    {
        for (auto& j : i)
        {
            j.Char.AsciiChar = (unsigned char)219;
            j.Attributes = rand() % 256;
        }
    }

    WriteConsoleOutputA(GetStdHandle(STD_OUTPUT_HANDLE), backBuffer[0].data(), charBufferSize, characterPosition, &writeArea);
}

1 个答案:

答案 0 :(得分:3)

问题是嵌套 std::vector的内存分配布局,以及它与Win32 API WriteConsoleOutput()所期望的不匹配。

std::vector连续分配的内存。但是如果你的std::vector 嵌套在外部std::vector,则整个分配的内存不再连续!

如果你想要一个完整的连续内存块,你应该分配一个总大小为std::vector width x height,并将其用作{{1的内存缓冲区}}

我在此路径后稍微修改了您的代码,现在它似乎有效:

WriteConsoleOutput()