缓冲区溢出问题VC ++

时间:2010-04-23 05:52:09

标签: visual-c++ msdn

当我执行我的代码时,我收到此错误

LPTSTR lpBuffer;
::GetLogicalDriveStrings(1024,lpBuffer);
while(*lpBuffer != NULL)
{
  printf("%s\n", lpBuffer); // or MessageBox(NULL, temp, "Test", 0); or whatever
  lpBuffer += lstrlen(lpBuffer)+1;
  printf("sizeof(lpBuffer) %d\n",lstrlen(lpBuffer));
}

输出

C

sizeof(lpBuffer)3

d

sizeof(lpBuffer)3

电子

sizeof(lpBuffer)3

˚F

sizeof(lpBuffer)0

3 个答案:

答案 0 :(得分:0)

lpBuffer指向随机内存。你需要这样的东西:

LPTSTR lpBuffer = new TCHAR[1025];

编辑:将数组大小更正为1025而不是1024,因为length参数是1024.此API需要仔细阅读。

答案 1 :(得分:0)

您应该传递将复制字符串的内存地址。但是,您没有为保留字符分配任何空间。您需要在将空间传递给GetLogicalDriveStrings函数之前分配空间。您可以在@Windows程序员提供的情况下在堆上分配内存,或者如果在编译时知道字符串的最大长度,您可以使用TCHAR lpBuffer[1024];在堆栈上分配它。另外,您使用printf来打印unicode(可能因为它取决于编译器标志)。这不起作用,只打印第一个字符。

答案 2 :(得分:0)

你需要实际传入缓冲区 - 请注意,传入的缓冲区大小需要比缓冲区的实际大小小一个,以便考虑最终终止'\ 0'字符(我不知道)为什么API的设计是这样的。)

以下是您示例的略微修改版本:

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

enum {
    BUFSIZE = 1024
};

int _tmain (int argc, TCHAR *argv[])
{
    TCHAR szTemp[BUFSIZE];
    LPTSTR lpBuffer = szTemp;   // point lpBuffer to the buffer we've allocated


    szTemp[0] = _T( '\0');  // I'm not sure if this is necessary, but it was
                            //   in the example given for GetLogicalDriveStrings()

    GetLogicalDriveStrings( BUFSIZE-1, lpBuffer);   // note: BUFSIZE minus 1

    while(*lpBuffer != _T('\0'))
    {
      _tprintf( _T("%s\n"), lpBuffer);
      lpBuffer += lstrlen(lpBuffer)+1;
      _tprintf( _T("length of lpBuffer: %d\n"),lstrlen(lpBuffer));
    }

    return 0;
}