В функции newEmployee()
вы выполняете:
head -> m_Name = name;
В обоих вызовах newEmployee()
вы передаете tmp
:
a = newEmployee ( tmp, a );
a = newEmployee ( tmp, a );
Итак, name
указатель обоих узлов указывает на одно и то же местоположение tmp
, которое содержит имя.Если вы внесете какое-либо изменение в значение tmp
, оно будет отражено в обоих.
Представление в памяти будет выглядеть примерно так:
---------------------
|m_Name|m_Next|m_Bak|
---------------------
|
\/ tmp
-----------
| Peter |
-----------
/\
|
---------------------
|m_Name|m_Next|m_Bak|
---------------------
// Both the node m_Name is pointing to same location.
// Make any change in tmp and the changes will reflect in both the pointers
// as they are pointing to same location.
Чтобы решить эту проблему,Вы должны выделить память для m_Name
и скопировать в нее tmp
.Вы можете использовать strdup()
для решения этой проблемы.В newEmployee()
замените это:
head -> m_Name = name;
следующим:
head -> m_Name = strdup(name);
Функция strdup()
возвращает указатель на новую строку, котораядубликат строки передается ей.strdup () выделяет память для новой строки и возвращает ее указатель.Не забудьте освободить его, используя free()
, как только вы закончите с ним.Обратите внимание, что strdup()
не является частью C
Standard.
Тип возврата функции newEmployee()
равен TEMPLOYEE *
, но вы ничего не возвращаете из этой функции, если malloc
успешен.Кроме того, если по какой-то причине malloc
не удается, вы возвращаете целочисленную константу 1
, что неверно.Вместо этого вы должны вернуть NULL
в случае сбоя.