2010-04-23 129 views
0

当我执行我的代码我收到此错误缓冲区溢出问题VC++

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)); 
} 

输出

Ç

的sizeof(lpBuffer)3

d

的sizeof( lpBuffer)3

Ë

的sizeof(lpBuffer)3

˚F

的sizeof(lpBuffer)0

回答

0

lpBuffer指向到随机存储器。你需要的东西是这样的:

LPTSTR lpBuffer = new TCHAR[1025]; 

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

+0

谢谢..它workign精细 但y个第一3个输出获得大小为3 – Sijith 2010-04-23 05:58:49

+0

像一个字符串“E:\”的长度为3 – 2010-04-23 05:59:50

+0

再次感谢 如果thaking 3的大小则y最后statment有大小为0 ˚F 的sizeof(lpBuffer)0 – Sijith 2010-04-23 06:03:14

0

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

0

您需要实际传入一个缓冲区 - 请注意,您传递的缓冲区的大小需要比缓冲区的实际大小小1以说明最终的终止'\ 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; 
} 
+0

你不能在unicode字符串中使用'printf'。它可能会在第一个字符后面遇到'\ 0'字符。 – Naveen 2010-04-23 06:09:15

+0

主要的第二个参数在Unicode构建中也有问题。 – 2010-04-23 06:16:24

+0

哦,我明白了,原来的程序有同样的错误,Michael Burr没有注意到他抄录了什么:-) – 2010-04-23 06:20:16