Вы можете использовать любую технику.Если вам, возможно, потребуется отредактировать поля после создания структуры, то, вероятно, более уместны отдельные распределения.Если нет необходимости редактировать поля, то для одного выделения требуется только одно освобождение, а также уменьшается фрагментация памяти.Для каждого выделения есть некоторые накладные расходы.
Если вы используете одно распределение, вам нужно будет исправить назначения.Этот код не проверяет выделение памяти, но должен.
size_t len_name = strlen(theName);
size_t len_email = strlen(theEmail);
size_t len_phone = strlen(thePhone);
aContact *paContact = malloc(sizeof(*paContact) + len_name + len_email + len_phone + 3);
char *data = (char *)paContact + sizeof(*paContact);
paContact->name = data;
strcpy(paContact->name, theName);
data += len_name + 1;
paContact->email = data;
strcpy(paContact->email, theEmail);
data += len_email + 1;
paContact->phone = data;
strcpy(paContact->phone, thePhone);
paContact->next = NULL;
Однако может быть проще использовать POSIX strdup()
:
aContact *paContact = malloc(sizeof(*paContact));
paContact->name = strdup(theName);
paContact->email = strdup(theEmail);
paContact->phone = strdup(thePhone);
paContact->next = NULL;
При необходимости вы можете очень легко написать суррогат для strdup()
:
char *str_dup_surrogate(const char *str)
{
size_t len = strlen(str) + 1;
char *result = malloc(len);
if (result != NULL)
memmove(result, str, len);
return result;
}
Обратите внимание, что имя str_dup_surrogate()
избегает будущих указаний для библиотеки C, указанной в C11 §7.31.13Обработка строк <string.h>
.Я бы соблазнился сократить его до str_dup()
, которое также является определяемым пользователем именем.