Это утверждение:
elem->data = "some_string";
делает указатель data
на строковый литерал "some_string"
.
А здесь:
strcat(elem->data, "another_string");
вы пытаетесь скопировать строкулитерал "another_string"
на указатель, который указывает на другой строковый литерал.Согласно стандарту, попытка изменить строковый литерал приводит к неопределенному поведению, поскольку он может храниться в хранилище только для чтения.
Вы должны выделить память для data
, например:
elem->data = calloc(50, 1); // sizeof (char) is 1
Затем скопируйте "some_string"
в него;
strcpy (elem->data, "some_string");
Затем объедините "another_string"
к нему:
strcat (elem->data, "another_string");
В качестве альтернативы вы можете использовать snprintf()
также:
snprintf (elem->data, 49, "%s%s", "some_string", "another_string");
РЕДАКТИРОВАТЬ:
Спасибо @alk за указание этого.
Указатель elem
не указывает на допустимую память.Сначала вы должны выделить память для указателя struct list_elem
elem
, например:
elem = malloc (sizeof (struct list_elem));
if (elem == NULL)
exit(EXIT_FAILURE);