Назначение указателей не копирует их содержимое.Просто заставляет их указывать на один и тот же адрес памяти.
В своем коде вы выделяете память для нового узла str
и указываете его на адрес буфера (word
для вашего случая).Делая это, в конечном итоге все узлы str
будут указывать на содержимое адрес последнего значения буфера (пять для вашего случая).
newnode->string = malloc(50*sizeof(char));
newnode->string = str;
Другая проблема заключается в том, что вы не выделяете память динамически на основесодержимое буфера.
Чтобы выделить точно необходимый объем памяти, попробуйте следующее:
Замените:
newnode->string = malloc(50*sizeof(char));
На:
newnode->string = malloc((strlen(str)+1)*sizeof(char));
На strlen
вы получаете количество символов, а +1
- для выделения места для завершающего символа '\0'
.
Итак, чтобы исправить вашу первоначальную проблему, вам необходимо скопировать содержимое буфера в недавно выделенную память:
Заменить:
newnode->string = str;
на
strcpy(newnode->string,str);