我是 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/