2016-07-12 34 views
0

イテレータからTCHAR[]を出力しようとすると、アクセス違反が発生し、これを解決してイテレータを使用する方法はありますか?何がうまくいかないのか分かりませんか?イテレータアクセス違反の原因と解決方法

struct FileInfo 
{ 
    TCHAR path[MAX_PATH]; 
}; 

void iter() 
{ 
    std::vector<FileInfo> v; 

    for (int i = 0; i < 5; i++) 
     v.push_back({ _T("abc") }); 

    for (int i = 0; i < v.size(); i++) { 
     OutputDebugString(_T("Ok ")); 
     OutputDebugString(v[i].path); 
     OutputDebugString(_T("\n")); 
    } 

    for (auto it = v.begin(); it != v.end(); it++){ 
     OutputDebugString(_T("Bad ")); 
     OutputDebugString((LPTSTR)*it->path); // CAUSES runtime error here 
     OutputDebugString(_T("\n")); 
    } 
} 

答えて

2

*it->pathTCHAR、ないTCHAR*に評価されます。

キャストa TCHAR~LPTSTRは正しくありません。 TCHAR*LPTSTRを鋳造することはOKです。

を使用でき

OutputDebugString((LPTSTR)it->path); 

または

OutputDebugString((LPTSTR)(*it).path)); 
1

次のメッセージとプログラムがクラッシュ:TEST.EXEで0x778180E0(ntdll.dllの)で

未処理の例外:0xC0000005: アクセス違反の読み取り場所は0x00000061です。

興味深いもの:0x00000061あなたが出力したい文字列の最初の文字である文字aのASCII値です。することによって: pathの文字列の最初の文字を取得します。そして、あなたがするとき (LPTSTR)*it->pathあなたはポインタの文字列の最初の文字をキャストします。したがって、エラー:reading location 0x00000061

関連する問題