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

C++ MycPy访问破坏内存块

c++
  •  0
  • A191919  · 技术社区  · 7 年前

    我是C++领域的新手。 在线 memcpy(combined + 14 + 40, pThirdPart, size); 它是投掷

    在memcpy.exe中的0x0fb046ee(vcruntime140d.dll)处引发异常: 0xC0000005:访问冲突读取位置0x00544000。

    为什么会这样?

    const long size = 8294400;
    char firstPart[14] = "3412345";
    char secondPart[40] = "daffda";
    char *thirdPart = new char[size];
    
    sprintf_s(thirdPart, size, "Test TEst tset ... and other symbols");
    
    BYTE *pFirstPart = reinterpret_cast<BYTE*>(&firstPart);
    BYTE *pSecondPart = reinterpret_cast<BYTE*>(&secondPart);
    BYTE *pThirdPart = reinterpret_cast<BYTE*>(&thirdPart);
    
    BYTE *combined = new BYTE[(size + 14 + 40)];
    
    memcpy(combined, pFirstPart, 14);
    memcpy(combined + 14, pSecondPart, 40);
    memcpy(combined + 14 + 40, pThirdPart, size);
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   gmoshkin    7 年前

    pThirdPart 指向的地址 thirdPart ,而不是所指的地址 *thirdPart .

    您可能会感到困惑,因为数组的地址与指针的地址不同。当你有这样的数组时

    char array[10];
    

    获取这个变量的地址与不引用它和索引相同。 array 与相同的值 &array .

    但是有了指针情况就不同了

    char *pointer;
    

    pointer 值与 &pointer

    这只是你必须意识到的C/C++的一个怪癖。

    所以在你的程序中你应该

    BYTE *pFirstPart = reinterpret_cast<BYTE*>(&firstPart);
    BYTE *pSecondPart = reinterpret_cast<BYTE*>(&secondPart);
    BYTE *pThirdPart = reinterpret_cast<BYTE*>(thirdPart);
    

    甚至

    BYTE *pFirstPart = reinterpret_cast<BYTE*>(firstPart);
    BYTE *pSecondPart = reinterpret_cast<BYTE*>(secondPart);
    BYTE *pThirdPart = reinterpret_cast<BYTE*>(thirdPart);
    

    两种变体都可以工作。