C Связанный список - значение изменения указателя - PullRequest
0 голосов
/ 30 декабря 2018

Так что я довольно новичок в C и указателях, и у меня есть проект для школы, чтобы закончить функции для добавления в связанный список

, вот как это выглядит:

TEMPLOYEE * newEmployee(const char * name, TEMPLOYEE * next)
{
    TEMPLOYEE* head = NULL;
    head = malloc(sizeof(TEMPLOYEE));
    if(head==NULL)
    {
        return 1;
    }

    head -> m_Name = name;
    head -> m_Next = next;
    head -> m_Bak = NULL;
}

это работает при вводе имени в виде строки, например a = newEmployee ( "Peter", a );, но когда я пытаюсь добавить с использованием временного значения m_Name примерно так

strncpy ( tmp, "Victoria", sizeof ( tmp ) );
a = newEmployee ( tmp, a );
strncpy ( tmp, "Peter", sizeof ( tmp ) );
a = newEmployee ( tmp, a );

список изменится со значением, поэтому в нем будет два сотрудникас именем Питер вместо Питера и Виктории, и я не могу найти, как это сделать.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 30 декабря 2018

В функции 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 в случае сбоя.

...