_tcscpy_s函数引发的问题
網(wǎng)上下載的VS2017 VC++工程,發(fā)現(xiàn)一段代碼老是報(bào)堆破壞的的錯(cuò)誤,當(dāng)時(shí)沒(méi)去理會(huì),自己寫(xiě)了一段代碼重新實(shí)現(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;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
后來(lái)經(jīng)過(guò)仔細(xì)分析和調(diào)試,發(fā)現(xiàn)問(wèn)題出在_tcscpy_s函數(shù),通過(guò)修改動(dòng)態(tài)內(nèi)存大小:TCHAR *szTemp = new TCHAR[128];
錯(cuò)誤暫時(shí)消失。由此推測(cè)是內(nèi)存的非法訪問(wèn)造成的。查看MSDN,發(fā)現(xiàn)是對(duì)函數(shù)的第二個(gè)參數(shù)的理解出錯(cuò)了,把那個(gè)長(zhǎng)度當(dāng)成內(nèi)存字節(jié)數(shù)了,應(yīng)該是字符數(shù)才對(duì)。
正確方式:由 _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ū)。
返回值
如果成功,則為零;否則返回錯(cuò)誤。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的_tcscpy_s函数引发的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 理解SetWindowOrg,SetVi
- 下一篇: 严重性代码说明项目文件行 禁止显示状态错