Как я могу скопировать непосредственно структуру, которая находится в массиве указателей структур на другой в C - PullRequest
0 голосов
/ 23 ноября 2018

Мне нужно напрямую скопировать значение из array в array2, которое является массивом указателей для использования значений organ.И в этом коде я использовал функцию memcpy, но она не работала:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct organ{
    char *name;
};

struct human{
    struct organ *org;

};

void main(void){
    struct human*array = malloc(sizeof(struct human));
    array[0].org = malloc(sizeof(struct organ));
    array[0].org[0].name= malloc(6);

    struct human*array2 = malloc(sizeof(struct human));
    array2[0].org = malloc(sizeof(struct organ));

    strcpy(array[0].org[0].name, "lungs");
    printf("array name: %s\n",array[0].org[0].name);
    memcpy(&array2[0].org[0], &array[0].org[0], sizeof(struct organ));

    free(array[0].org[0].name);
    free(array[0].org);
    free(array);

    printf("array2 name: %s\n",(array2[0].org[0].name));

    free(array2[0].org);
    free(array2);
}

Что я сделал не так?Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 23 ноября 2018

Вот упрощение проблемы, как в вашем коде:

struct organ a, b;
a.name = malloc(6);
strcpy(a.name, "hello");
b = a;
free(a.name);
puts(b.name);

Ваш код использует memcpy, но memcpy(&b, &a, sizeof b); практически такой же, как b = a;, поэтому я использовал более простой синтаксисв моем примере.

Проблема в том, что есть только один вызов malloca.name, и b.name указывают на один и тот же блок памяти.Вы освобождаете этот блок и затем пытаетесь вывести его содержимое.

Возможно, вы хотите, чтобы b.name имел собственный блок памяти.Это означает, что вам нужно снова вызвать malloc, оператор = (или функция memcpy) не вызывает malloc.

Например, в моем коде измените строку b = a; на:

b.name = malloc( strlen(a.name) + 1 );
strcpy(b.name, a.name);

Другими словами, процедура для так называемого "глубокого копирования" struct organ не совпадает с процедурой, выполняемой оператором присваивания.

Я бы порекомендовал вам сделать функцию для выполнения копии struct organ, которая ведет себя так, как вы хотите;и вызовите эту функцию вместо использования оператора присваивания или memcpy.

Вы также можете сделать то же самое для копирования struct human.

...