C++ memcpy 访问冲突大块内存

标签 c++

我是 C++ 领域的新手。 在 memcpy(combined + 14 + 40, pThirdPart, size); 上抛出

Exception thrown at 0x0FB046EE (vcruntime140d.dll) in Memcpy.exe: 0xC0000005: Access violation reading location 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);

最佳答案

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);

两种变体都可以。

关于C++ memcpy 访问冲突大块内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51483339/

相关文章:

C++11 自动/我不明白的东西

c++ - Lua & C++ API 获取执行信息

c++ - getline 函数的多个分隔符,c++

c++ - ATL 窗口中的 WebBrowser 控件。如何在窗口卸载时释放内存?我卡住了

c++ - 将 char[] 数组转换为字节,然后将字节转换为 int,反之亦然

android - 尝试为 android 示例构建 OpenCV 时运行构建器 'CDT Builder' 时出错

c++ - VexCL 中的密集矩阵 vector 乘法

c++ - 使用 movsd 使编译器复制字符

c++ - 我需要调用 CloseHandle 吗?

C++ memcpy 返回 true 没有任何变化