И, между прочим, есть функция, которая делает то, что вы хотите, она strdup
не соответствует стандарту C, но почти везде, и может быть в конечном итоге реализована в 2-х строчках, если это не так.
person *make_person(const char *first, const char *last, const char *location) {
person *personp = malloc(sizeof(struct person));
personp->first = strdup(first);
personp->last = strdup(last);
personp->location = strdup(location);
personp->next_person = NULL;
return personp ;
}
РЕДАКТИРОВАТЬ: я добавил также const
квалификаторы к сигнатуре функции, поскольку передаваемые строки только читаются и не изменяются. Это дает немного больше информации программисту, который будет использовать эту функцию в будущем. Он будет знать, что может безопасно передавать свои буферы и постоянные строки, не беспокоясь о том, что функция может взорваться.