将内存复制到结构时EXC_BAD_ACCESS

时间:2019-05-06 10:44:17

标签: c++ macos memcpy

在尝试使用std :: memcpy复制一堆字节时,我遇到了一个奇怪的EXC_BAD_ACCESS。

我有一个std :: string,其中包含来自PNG file的数据。我使用以下结构表示PNG块:

struct PngChunk
{
    int length;
    char type[4]; // IHDR, PLTE, IDAT, IEND, ...
    unsigned char* data;
    unsigned int crc;

} typedef PngChunk;

我正在按以下方式逐块读取它:

首先,我读取长度和类型:

std::memcpy((void*) &chunk, ptr, sizeof(unsigned int) + (sizeof(char) * 4));
ptr += sizeof(unsigned int) + (sizeof(char) * 4); // advance pointer to data

我将读取的长度字节交换为little endian(需要,因为存储在big-endian中)。然后我像这样读取块数据:

chunk.data = new unsigned char[chunk.length];
std::memcpy((void*) &chunk.data, ptr, chunk.length);
ptr += chunk.length; // advance pointer to CRC

最后我读了块CRC

std::memcpy((void*) &chunk.crc, ptr, sizeof(unsigned int));
ptr += sizeof(unsigned int);

当我输出块的类型/长度时,我可以清楚地看到它们被正确读取,但是当我尝试访问数据时,我遇到了上面的错误。我不知道为什么既然缓冲区足够大,可以存储块数据。

有人有主意吗?

预先感谢

1 个答案:

答案 0 :(得分:2)

我认为问题出在以下代码行中,您是在使用data变量的地址。

std::memcpy((void*) &chunk.data, ptr, chunk.length);

由于您需要的是变量指向的地址,因此必须将&放在chunk.data之前。