_tcscpy_s函数引发的问题
網(wǎng)上下載的VS2017 VC++工程,發(fā)現(xiàn)一段代碼老是報堆破壞的的錯誤,當(dāng)時沒去理會,自己寫了一段代碼重新實現(xiàn)了需要的功能:
?? ??? ??? ??? ?if(dwDevName != NULL)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?/*
?? ??? ??? ??? ??? ?if(*sValue)
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?TCHAR *szTemp = new TCHAR[sizeof(DWORD)];
?? ??? ??? ??? ??? ??? ?_tcscpy_s(szTemp, sizeof(DWORD)*sizeof(TCHAR), sValue+3);
?? ??? ??? ??? ??? ??? ?dwDevName[idx] = (DWORD)_ttoi(szTemp);
?? ??? ??? ??? ??? ??? ?delete [] szTemp;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?*/?? ?
?? ??? ??? ??? ??? ?if (*sValue)
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?int k;
?? ??? ??? ??? ??? ??? ?int comNum = 0;
?? ??? ??? ??? ??? ??? ?for (k = 0; k < 3; k++)
?? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ?if (sValue[3 + k] == '\0')
?? ??? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ?else
?? ??? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ?comNum = comNum*10+(sValue[3 + k]-0x30);
?? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ?dwDevName[idx] = (DWORD)comNum;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
后來經(jīng)過仔細(xì)分析和調(diào)試,發(fā)現(xiàn)問題出在_tcscpy_s函數(shù),通過修改動態(tài)內(nèi)存大小:TCHAR *szTemp = new TCHAR[128];
錯誤暫時消失。由此推測是內(nèi)存的非法訪問造成的。查看MSDN,發(fā)現(xiàn)是對函數(shù)的第二個參數(shù)的理解出錯了,把那個長度當(dāng)成內(nèi)存字節(jié)數(shù)了,應(yīng)該是字符數(shù)才對。
正確方式:由 _tcscpy_s(szTemp, sizeof(DWORD)*sizeof(TCHAR), sValue+3);
改為:?_tcscpy_s(szTemp, sizeof(DWORD), sValue+3);
?
?
errno_t strcpy_s( char *dest, rsize_t dest_size, const char *src );
參數(shù)
dest
目標(biāo)字符串緩沖區(qū)的位置。
dest_size
在目標(biāo)字符串緩沖區(qū)的大小char單位窄和多字節(jié)函數(shù),并wchar_t寬函數(shù)的單位。 此值必須大于零且不大于RSIZE_MAX。
src
以 null 結(jié)尾的源字符串緩沖區(qū)。
返回值
如果成功,則為零;否則返回錯誤。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的_tcscpy_s函数引发的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理解SetWindowOrg,SetVi
- 下一篇: 严重性代码说明项目文件行 禁止显示状态错