代码之家  ›  专栏  ›  技术社区  ›  SPlatten

运行时检查失败#2-变量“…”周围的堆栈已损坏

  •  0
  • SPlatten  · 技术社区  · 6 年前

        inline void WriteByteList( /*[in]*/  PBYTE pbytSrc
                                 , /*[in]*/  size_t tSrcSize
                                 , /*[out]*/ LPWSTR pszDest
                                 , /*[out]*/ size_t tDestSize ) {
            wchar_t szItem[ 12 ], *pszNumber = &szItem[0];
            size_t tSize = sizeof(szItem) / sizeof(szItem[0]);  
            for ( size_t tByte=0; tByte<tSize; tByte++ ) {      
                if ( tByte == 1 ) {
                    *pszNumber++ = L' ';
                }
                _ultow_s((unsigned long)pbytSrc[tByte], pszNumber, tSize, 10);
                wcscat_s(pszDest, tDestSize, szItem);
             }
        }
    

    我真的看不出密码有什么问题。

    以下是导致问题的调用:

        WriteByteList( (PBYTE)pProgramId->Byte, nliPROGRAM_ID_LEN, szMsg, tMsgSize );
    

        128, 0, 1, 1, 1, 1, 1, 1
    

    nliPROGRAM_ID_LEN是一个声明为8的常量。

    szMsg是一个数组,声明为:

        wchar_t szMsg[500];
    

    tMsgSize是szMsg中的元素数:

        tMsgSize = sizeof(szMsg) / sizeof(szMsg[0]);
    

    当我遍历这个例程时,我得到:

        local variable tSize initialised to 12
        pszNumber initialised to point to szItem
    

    循环迭代0: szItem包含“128”,后跟0(空) pszDest包含“128”

    szItem包含“0” pszDest包含“128 0”

    循环迭代2: szItem包含“1” pszDest包含“128 0 1”

    循环迭代3: szItem包含“1”

    循环迭代4: pszDest包含“128 0 1 1 1”

    循环迭代5: pszDest包含“128 0 1 1 1 1”

    循环迭代6: szItem包含“1”

    循环迭代7: szItem包含“1”

        Run-Time Check Failure #2 - Stack around the variable 'szItem' was corrupted.
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   SPlatten    6 年前

    重写函数:

        inline void WriteByteList( /*[in]*/  PBYTE pbytSrc
                                 , /*[in]*/  size_t tSrcSize
                                 , /*[out]*/ LPWSTR pszDest
                                 , /*[out]*/ size_t tDestSize ) {
            wchar_t szItem[ 12 ];
            size_t tSize = sizeof(szItem) / sizeof(szItem[0]);  
            for ( size_t tByte=0; tByte<tSrcSize; tByte++ ) {       
                size_t tOffset = 0;
                szItem[tOffset] = L' ';
                if ( tByte > 0 ) {
                    tOffset++;
                }
                _ultow_s((unsigned long)pbytSrc[tByte], &szItem[tOffset], tSize - tOffset, 10);
                wcscat_s(pszDest, tDestSize, szItem);
            }
        }
    

    现在可以正常工作了。