Visual c++ 缓冲区溢出问题VC++;

Visual c++ 缓冲区溢出问题VC++;,visual-c++,msdn,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\

当我执行我的代码时,我得到了这个错误

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

E

sizeof(lpBuffer)3

F


sizeof(lpBuffer)0

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

LPTSTR lpBuffer = new TCHAR[1025];

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

您应该传递一个将复制字符串的内存地址。但是,您尚未分配任何空间来容纳字符。在将空间传递给
GetLogicalDriveStrings
函数之前,需要分配空间。您可以按照@Windows程序员支持的方式在堆上分配内存,或者如果在编译时已知字符串的最大长度,您可以使用
TCHAR lpBuffer[1024]在堆栈上分配它此外,您正在使用
printf
打印unicode(可能是因为它取决于编译器标志)。这将不起作用,只打印第一个字符。

您需要实际传入一个缓冲区-请注意,传入的缓冲区大小需要比缓冲区的实际大小小一个,以说明最终终止的“\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;
}
#包括
#包括
#包括
枚举{
BUFSIZE=1024
};
int_tmain(int argc,TCHAR*argv[])
{
TCHAR szTemp[BUFSIZE];
LPTSTR lpBuffer=szTemp;//将lpBuffer指向我们分配的缓冲区
szTemp[0]=\u T('\0');//我不确定这是否有必要,但确实有必要
//在GetLogicalDriveStrings()的示例中
GetLogicalDriveStrings(BUFSIZE-1,lpBuffer);//注意:BUFSIZE减去1
而(*lpBuffer!=\u T('\0'))
{
_tprintf(_T(“%s\n”),lpBuffer);
lpBuffer+=lstrlen(lpBuffer)+1;
_tprintf(_T(“lpBuffer的长度:%d\n”)、lstrlen(lpBuffer));
}
返回0;
}

谢谢。。其工作正常,但y前3个输出的大小为3。类似“E:\”的字符串长度为3。再次感谢您,如果它的大小为3,则y最后一个语句的大小为0 F sizeof(lpBuffer)0@sijith:无法依赖该大小,因为行为未定义。它可以是3,也可以是100,因为您指向的内存只是一个随机位置。字符串“F:\”的长度为3,而不是零。该字符串后跟一个空字符串,您将获得该空字符串的长度,即0。您不能将
printf
与unicode字符串一起使用。它可能会在自己的第一个字符之后遇到
\0
字符。main的第二个参数在Unicode构建中也有问题。哦,我明白了,原来的程序有同样的错误,Michael Burr没有注意到他复制的内容:-)好的,好的,我没有注意到太多,但是我只是把原始的例子放到了我的标准测试项目中,它不是TCHAR程序。老实说,我不认为这有损于答案的意义,但我编辑了答案以修复它(我认为),因为我可能首先应该这样做(或者干脆扔掉
TCHAR
东西),以防有人把它丢到为UNICODE设置的VS项目中。现在你真的把它搞错了。在Unicode构建中,\u tprintf将映射到Unicode版本,但您的“格式”参数仍然是ANSI,因为您没有将它们适配到\u t()。