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)0lpBuffer指向随机内存。你需要这样的东西:
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()。