首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将内存复制到结构时的EXC_BAD_ACCESS

将内存复制到结构时的EXC_BAD_ACCESS
EN

Stack Overflow用户
提问于 2019-05-06 18:44:17
回答 1查看 48关注 0票数 0

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

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

代码语言:javascript
复制
struct PngChunk
{
    int length;
    char type[4]; // IHDR, PLTE, IDAT, IEND, ...
    unsigned char* data;
    unsigned int crc;

} typedef PngChunk;

我用下面的方式一块一块地读:

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

代码语言:javascript
复制
std::memcpy((void*) &chunk, ptr, sizeof(unsigned int) + (sizeof(char) * 4));
ptr += sizeof(unsigned int) + (sizeof(char) * 4); // advance pointer to data

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

代码语言:javascript
复制
chunk.data = new unsigned char[chunk.length];
std::memcpy((void*) &chunk.data, ptr, chunk.length);
ptr += chunk.length; // advance pointer to CRC

最后我读到了块CRC

代码语言:javascript
复制
std::memcpy((void*) &chunk.crc, ptr, sizeof(unsigned int));
ptr += sizeof(unsigned int);

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

有没有人有主意?

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-06 18:54:51

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

代码语言:javascript
复制
std::memcpy((void*) &chunk.data, ptr, chunk.length);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56003576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档