C 文本写入随机数据.是否有缓冲区溢出

C++ TextOut writes random data. Is there a buffer overflow?

本文关键字:是否 缓冲区 溢出 数据 随机 文本      更新时间:2023-10-16

我正在为使用Winapi的编程类编写一些示例程序。我熟悉GUI编程,但不熟悉C 。作为测试的一部分,我遇到了异常。我希望有人会知道我在做什么,并能够解释修复程序。以下是回调功能。大多数代码直接从基本涂料上的示例中复制。

LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM w, LPARAM l)
{
   PAINTSTRUCT ps;
   HDC hdc;
   std::string txt = "Hello";
   switch(msg)
   {
      hdc = BeginPaint(hwnd, &ps);
      TextOut(hdc, 0, 60, txt.c_str(), 45);
      EndPain, h, &ps);
   }
}

因此,该函数应该只是在GUI上打印" Hello",而是我看到了" Hello XC"。我将字符串的长度扩大到45,看到了更多。它打印文本的随机位。我已经看到了将要用于代表的班级名称和字符串值。

我不知道为什么会发生这种情况,但是看来TXT正在读取远远超过缓冲区的末端。我添加了一个 0。没有不同。每次值都不同。

任何想法发生了什么事?

textout使用最终参数CCHSTRING来确定要打印多少个字符。您必须告诉它正确的号码。

https://msdn.microsoft.com/en-us/library/windows/desktop/dd145133.aspx

lpString [in]
指向要绘制的字符串的指针。该字符串不需要零终止,因为CCHSTRING指定了字符串的长度。

cchstring [in]
字符串的长度由lpstring指向字符。

TextOut()不会停止在零终端写文本,只要您指定,它就会继续进行。最后一个参数告诉函数编写多少个字符。而不是给它45,而是像strlen(txt.c_str())一样给它。