Iterator访问冲突的原因和解决方法

时间:2016-07-12 05:50:40

标签: c++ iterator

为什么尝试从迭代器输出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 个答案:

答案 0 :(得分:2)

*it->path评估为TCHAR,而不是TCHAR*

TCHAR投射到LPTSTR是不对的。将TCHAR*投射到LPTSTR即可。

您可以使用:

OutputDebugString((LPTSTR)it->path);

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

答案 1 :(得分:1)

程序崩溃并显示以下消息:

  

test.exe中0x778180E0(ntdll.dll)的未处理异常:0xC0000005:   访问冲突读取位置0x00000061。

有趣的事情:0x00000061是字符a的ascii值,它是您要输出的字符串的第一个字符。通过做 : *it->path您获得了path中字符串的第一个字符。然后当你这样做 (LPTSTR)*it->path您将字符串的第一个字符强制转换为指针。因此错误:reading location 0x00000061