2012-04-28 91 views
0
#ifndef UNICODE 
#define UNICODE 
#endif 

#include <Windows.h> 
#include <cstdio> 

TCHAR* getSystemVolumine() 
{ 
    TCHAR volumine[2]; 
    TCHAR buffer[30]; 

    GetSystemWindowsDirectory(buffer,30); 

    for(int i=0 ; i < 2 ; i++) 
     volumine[i]=buffer[i]; 

    return volumine; 
} 


int main() 
{ 
    wprintf(L"Your system volumine letter%s\n",getSystemVolumine()); 
    system("pause"); 
} 

我不知道這段代碼有什麼問題。調試結果顯示沒有錯誤,也沒有警告,但輸出是:獲取包含Windows系統目錄的驅動器的盤符

Your system volumine letter 
Press any key to continue... 

回答

4

你是返回一個指向一個局部變量,當函數返回,該變量不再exsits 一種wprintf字符串必須結束與' \ 0' 。

#include <Windows.h> 
#include <cstdio> 

void getSystemVolumine(TCHAR *vol) 
{ 
    TCHAR buffer[30]; 

    GetSystemWindowsDirectory(buffer,30); 

    for(int i=0 ; i < 2 ; i++) 
     vol[i]=buffer[i]; 

    vol[2] = 0; 
} 


int main() 
{ 
    TCHAR vol[3]; 

    getSystemVolumine(vol); 

    wprintf(L"Your system volumine letter %S\n",vol); 
    system("pause"); 
} 
+0

我認爲做volumine靜態變量是多simplier解決方案:) – 0x6B6F77616C74 2012-04-28 14:27:11

+0

只是FWIW:它通常建議避免使用靜態因此,如果代碼是由多線程後,你就不會遇到問題;調用者提供緩衝區(上面)或者讓函數返回一個新的緩衝區被認爲是更清晰的。即使在單線程代碼中,如果某段代碼保存了指針,並且以後的調用會更改緩衝區中的值,則可能會出現問題。然而,在這種特殊情況下,由於系統目錄是常量,並且在進程的整個生命週期內不會改變(對於所有線程都是一樣的),所以靜態在這裏是很好和安全的。 – BrendanMcK 2012-04-30 17:30:25