在c++中使用_tcstock时出现AccessViolation错误
AccessViolation error while using _tcstok in C++
我试图运行以下代码
TCHAR* str1 = TEXT("C:\Program Files\Internet Explorer;");
const TCHAR* del = TEXT(";");
TCHAR* token = _tcstok(str1, del);
当我在VS 2010中运行这个时,我得到以下异常:
在String_Tchars.exe中0x10275af4 (msvcr100d.dll)的未处理异常:0xC0000005:访问违反写入位置0x0041839c.
我的目标是能够获得分号";"之前的部分,然后对该令牌进行追加,以获得最终字符串c:Program FilesInternet Explorer iexplorer .exe
有人能解释一下是什么导致了这个异常吗?
您只能使用strtok()
(及其Windows亲戚)和可修改的字符串。所以让你的字符串成为本地字符数组:
TCHAR str1[] = TEXT("C:\Program Files\Internet Explorer;");
TCHAR* token = _tcstok(str1, ";");
// etc.
tokenizer函数实际上通过将分隔符替换为空字节来修改字符串,因此无法在只读字符串上使用该函数。
如果您的字符串通过指向const的指针传递给您,请先将其复制到本地数组(例如复制到std::vector<TCHAR>
):
void foo(const TCHAR * str)
{
std::vector<TCHAR> s(str, _tcslen(str) + 1); // local copy, includes null terminator
TCHAR * str1 = s.data(); // or &s[0]
TCHAR* token = _tcstok(str1, ";");
// ...
}
_tcstok
试图修改常量字符串(string Literal),导致未定义行为,这以访问冲突的形式呈现。
我这里指的字符串Literal是:
TCHAR* str1 = TEXT("C:\Program Files\Internet Explorer;");
^^^^
程序不应该修改它,_tcstok
试图这样做,因此未定义行为。
使用可修改的非const字符串数组:
TCHAR str1[] = TEXT("C:\Program Files\Internet Explorer;");
相关文章:
- C++/CLI System.AccessViolation在托管类中调用非托管函数时出现异常
- 堆栈溢出后调用SymSetOptions时发生AccessViolation
- Visual C#在调用包装的C++CLI dll中的Lapack时引发System.AccessViolation
- c# unmanaged PInvoke AccessViolation
- AccessViolation调试有趣
- AccessViolation仅在优化的Win32构建(XMMATRIX)
- 在c++中使用_tcstock时出现AccessViolation错误
- Cocos2d-x CCSprite->setDisplayFrame AccessViolation crash