2010-04-23 51 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