Здравствуйте, моя задача - скопировать всю структуру в новую и выделить память структуры. Я хочу скопировать одну структуру в другую, а также я хочу скопировать память о ней. Поэтому, если я «освободлю» первую структуру, то эта информация будет храниться в памяти.
struct bmp_image* flip_vertically(const struct bmp_image* image) {
struct bmp_image* bmp = NULL;
bmp = (struct bmp_image*)realloc(bmp, sizeof(struct bmp_image));
memcpy(bmp, image, sizeof(struct bmp_image));
return bmp;
}
В чем может быть проблема?
Например:
Если я знаю, что
image-> data [5] .blue равен 255, и я хочу скопировать его, но мне нужно также сохранить эту информацию в памяти
Основная задача состоит в том, чтобы переверните картинку bmp. Все работает идеально для меня, но если я добавлю этот исходный код для теста, который пишет:
Running suite(s): flip_horizontally()
stderr
double free or corruption (!prev)
, это означает, что тест где-то освобождает старую структуру, поэтому у меня нет этой информации в новый
struct bmp_header{
uint16_t type; // "BM" (0x42, 0x4D)
uint32_t size; // file size
uint16_t reserved1; // not used (0)
uint16_t reserved2; // not used (0)
uint32_t offset; // offset to image data (54B)
uint32_t dib_size; // DIB header size (40B)
uint32_t width; // width in pixels
uint32_t height; // height in pixels
uint16_t planes; // 1
uint16_t bpp; // bits per pixel (1/4/8/24)
uint32_t compression; // compression type (0/1/2) 0
uint32_t image_size; // size of picture in bytes, 0
uint32_t x_ppm; // X Pixels per meter (0)
uint32_t y_ppm; // X Pixels per meter (0)
uint32_t num_colors; // number of colors (0)
uint32_t important_colors; // important colors (0)
} __attribute__((__packed__));
/**
* This structure describes a color consisting of relative intensities of
* red, green, and blue.
*/
struct pixel {
uint8_t blue;
uint8_t green;
uint8_t red;
//uint8_t alpha;
} __attribute__((__packed__));
/**
* Structure describes the BMP file format, which consists from two parts:
* 1. the header (metadata)
* 2. the data (pixels)
*/
struct bmp_image {
struct bmp_header* header;
struct pixel* data; // nr. of pixels is `width` * `height`
};
Main. c
int main () {
struct bmp_image* image = NULL;
FILE *stream = fopen("assets/saboteur.bmp", "r");
image = read_bmp(stream);
FILE *output_p1 = fopen("square2.bmp", "w");
struct bmp_image* newimage1 = NULL;
newimage1 = flip_vertically(image);
free_bmp_image(image);
write_bmp(output_p1, newimage1);
free(newimage1);
fclose(output_p1);
fclose(stream);
return 0;
}
Если я освобождаю изображение (старая структура), оно показывает для меня много ошибок, и я не могу записать это в файл. Для меня это означает, что он хочет читать из старой структуры.