C - Как добавить элемент структуры в динамически распределенный массив структур? - PullRequest
0 голосов
/ 14 октября 2019

Попытка добавить еще один элемент в массив структуры в C (специфично для Windows, используя VS2019 Community). Работает нормально, пока я не попытаюсь присвоить возвращаемое значение realloc для исходного массива. Код в main (объявления и инициализация, а также вызывающий код) выглядит следующим образом:

// server.h
struct server {
    wchar_t* name;
    wchar_t ip_address[16];
    int port;
};

// main.c
static int nb_servers = 0;
static struct server* servers = NULL;

void add_server(wchar_t* name, wchar_t ip_address[16], wchar_t* port)
{
    struct server newserver;
    newserver.name = name;

    wcsncpy(newserver.ip_address, ip_address, 16);

    char* port_char = malloc(6);
    if (port_char == NULL) {
        exit(EXIT_FAILURE);
    }
    size_t i;
    wcstombs_s(&i, port_char, 6, port, _TRUNCATE);

    int port_int = 0;
    str2int(&port_int, port_char, 10);

    newserver.port = port_int;

    // add to servers
    nb_servers = server_add(&servers, &newserver, nb_servers);
}

Затем в другом файле я пытаюсь добавить новый сервер в список:

// server.c
int server_add(struct server** servers, struct server* myserver, int nb_servers)
{
    struct server* tmp = (struct server*) realloc(*servers, (nb_servers + 1) * sizeof(struct server));
    if (tmp == NULL) {
        exit(EXIT_FAILURE);
    }

    tmp[nb_servers].name = (wchar_t*) calloc(strlen(myserver->name), sizeof(wchar_t));
    if (tmp[nb_servers].name == NULL) {
        exit(EXIT_FAILURE);
    }
    wcsncpy(tmp[nb_servers].name, myserver->name, strlen(myserver->name));
    wcsncpy(tmp[nb_servers].ip_address, myserver->ip_address, 16);
    tmp[nb_servers].port = myserver->port;

    *servers = tmp; // this only copies the first value [0]
                    // also tried **servers = *tmp and other combinations, nothing seems to work.

    return ++nb_servers;
}

Но «копируется» только первое значение, или, точнее, только серверы [0] указывают на допустимый объект. Тем не менее, от tmp [0] до tmp [nb_servers - 1] допустимы и содержат правильные данные. Я использую аналогичный механизм перераспределения для сжатия массива в методе remove_server, и это же переназначение работает в этом случае.

Вопрос : Как правильно добавить элемент структуры в массивструктурирует динамическое перераспределение памяти?

...