EXC_BAD_ACCESS при копировании памяти в структуру - PullRequest
0 голосов
/ 06 мая 2019

Я столкнулся со странным EXC_BAD_ACCESS при попытке использовать std :: memcpy для копирования группы байтов.

У меня есть std :: string, содержащая данные из PNG-файла .Я использую следующую структуру для представления фрагмента 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

Я поменяю местами байты длины чтения на младший (нужно, потому что они хранятся в старшем порядке).Затем я читаю данные чанка следующим образом:

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 Ответ

2 голосов
/ 06 мая 2019

Я полагаю, что проблема возникла из-за того, что вы берете адрес переменной data в следующей строке кода.

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

Так как вам нужен адрес, на который указывает переменная, вы должны сбросить & до chunk.data.

...