Попытка добавить еще один элемент в массив структуры в 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, и это же переназначение работает в этом случае.
Вопрос : Как правильно добавить элемент структуры в массивструктурирует динамическое перераспределение памяти?