【问题标题】:EXC_BAD_ACCESS while copying memory to structure将内存复制到结构时的 EXC_BAD_ACCESS
【发布时间】:2019-05-06 10:44:17
【问题描述】:

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

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

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

我将读取长度字节交换为小端(需要,因为存储在大端中)。然后我像这样读取块数据:

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

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

有人有想法吗?

提前致谢

【问题讨论】:

    标签: c++ macos memcpy


    【解决方案1】:

    我认为问题源于您在以下代码行中获取了data 变量的地址。

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

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

    【讨论】:

    • Holly... 这很快,它当然解决了我的问题。谢谢楼主!
    猜你喜欢
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2021-06-28
    • 2016-05-21
    • 1970-01-01
    相关资源
    最近更新 更多