Вы копируете его дважды и, предположительно, вторая цель, ptr->name
распределяется неправильно, поэтому он падает.
Что вы хотите сделать, это:
ptr->name = malloc(strlen(string)+1);
strcpy(ptr->name, string);
Выделите буфер в целевом местоположении.Не связывайтесь с временными переменными, если вам абсолютно не нужно.
Каждый буфер, в который вы пишете, должен иметь достаточно памяти, выделенной для него заранее .C не собирается проверять это для вас, он будет делать именно то, что вы просите, не задумываясь, поэтому, например, при работе с опасным оборудованием, таким как бензопила, вы должны очень внимательно следить за тем, как вы его используете.