为什么尝试从迭代器输出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"));
}
}
答案 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