C ++, как сделать копию назначения указателя - PullRequest
0 голосов
/ 06 марта 2020

У меня есть следующий код:

IMAGE *ptrInImage = ptrProcUnit->GetMeasureImage(0);
if (ptrInImage == NULL) {
    return(-2);
}
BYTE* rs, *rd, *rs2;
rs = (BYTE*)ptrInImage + sizeof(IMAGE);
rs2 = (BYTE*)ptrInImage + sizeof(IMAGE);

Мне потребуется rs2, чтобы указать точную копию пункта назначения rs. В настоящее время, когда я записываю данные в указатель rs2, он также редактирует изображение, находящееся за rs. Это не то, что мне нужно. Мне нужно, чтобы rs2 указывал на точную копию rs, и вместо этого я записывал в эту копию. Но я не могу понять, как это сделать.

Попытка, которая до сих пор дала наилучшие результаты, заключалась в следующем, но она приводила к другим проблемам, таким как ошибки доступа.

IMAGE *ptrInImage = ptrProcUnit->GetMeasureImage(0);
if (ptrInImage == NULL) {
    return(-2);
}


IMAGE TmpImage;
IMAGE *ptrTmpImage = ptrProcUnit->GetImageData(0);
memcpy(ptrTmpImage, ptrInImage, sizeof(IMAGE));

BYTE* rs, *rd, *rs2;
rs = (BYTE*)ptrInImage + sizeof(IMAGE);
rs2 = (BYTE*)ptrTmpImage + sizeof(IMAGE);

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

c ++, как сделать копию назначения указателя

Просто косвенно через указатель и использовать это в качестве аргумента для инициализации копирования другого объекта. Пример:

IMAGE *ptrInImage = ...
IMAGE copy = *ptrInImage;
0 голосов
/ 06 марта 2020

Проблема в том, что ваш пример предполагает, что IMAGE - это объект фиксированного размера, который предшествует переменной длины BYTE[]. Когда вы создаете копию только части IMAGE, вы не копируете BYTE[]. И ваш пример не показывает, сколько у вас есть байтов.

Если вы знаете это, вы можете вызвать operator new с sizeof(IMAGE)+bytelen, разместить вызов new, чтобы создать IMAGE во вновь выделенной памяти, а затем скопируйте оставшиеся байты. Возможно, вы захотите обновить и некоторые IMAGE поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...