Перераспределение структуры? Копировать структуру вставки - PullRequest
0 голосов
/ 24 апреля 2020

Здравствуйте, моя задача - скопировать всю структуру в новую и выделить память структуры. Я хочу скопировать одну структуру в другую, а также я хочу скопировать память о ней. Поэтому, если я «освободлю» первую структуру, то эта информация будет храниться в памяти.

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

Если я освобождаю изображение (старая структура), оно показывает для меня много ошибок, и я не могу записать это в файл. Для меня это означает, что он хочет читать из старой структуры.

1 Ответ

1 голос
/ 24 апреля 2020

memcpy делает "мелкую" копию, а не "глубокую" копию. Мелкая копия будет копировать только значения указателя в struct bmp_image, а не в память, на которую она указывает. Чтобы сделать глубокое копирование, отдельные поля должны быть выделены и скопированы. Вот несколько иллюстративных кодов. Проверка ошибок была опущена для краткости, но для окончательного кода должны быть проверены все результаты распределения.

struct bmp_image* flip_vertically(const struct bmp_image* image) {
    bmp = malloc(sizeof(*bmp)); 

    bmp->header = malloc(sizeof(*(bmp->header)));
    *bmp->header = *(image->header);

    size_t pixel_data_size =
        sizeof(*(bmp->data)) * bmp->header->width * bmp->header->height;
    bmp->data = malloc(pixel_data_size);
    memcpy(bmp->data, image->data, pixel_data_size);

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