Эта функция addfront () используется с nallo c () для связанного списка неправильно? - PullRequest
0 голосов
/ 20 января 2020

Этот код взят из: стр. 20-21 настоящего конспекта лекции pdf из ocw.

 struct node∗ nalloc ( int data )
 { 
    struct node∗ p=( struct node ∗) malloc ( sizeof (node )) ; 
    if ( p!=NULL) {
        p−>data=data ;
        p−>next=NULL;
    }
    return p;
 }

struct node∗ addfront ( struct node∗ head , int data )
{ 
    struct node∗ p= nalloc (data ); 
    if ( p==NULL) return head ;
    p−>next=head;
    return p;
}

Я думаю, что код неправильный, потому что указатель p является локальным для nallo c (), и использование его в addfront () приведет к неопределенному поведению. Я видел ответ на этот вопрос и считаю, что я прав, но может кто-нибудь проверить?

Ответы [ 2 ]

1 голос
/ 20 января 2020

Функция правильная. Но ваша логика c не так уж и плоха. Переменная p фактически локальна и больше не будет существовать, когда функция вернется. Однако p - это не память, выделенная вами с помощью malloc, а переменная, хранящая адрес памяти, выделенной вами .

Таким образом, оператор return p; вернет копия p, то есть копия адреса памяти, выделенной вами с помощью malloc().

В связанном вопросе пользователь создает локальный массив и возвращает указатель на Это. Видите, массив local и теперь динамически выделяется с помощью new или malloc(). Таким образом, его переменная эффективно содержит (автоматически) выделенную память, а не ее адрес. Однако возвращается только адрес, поэтому память теряется.

0 голосов
/ 20 января 2020

Вы не правы. В то время как p является локальной переменной в стеке, на что она не указывает. Происходит указатель на node в куче, возвращаемый из nalloc, и копия этого указателя безопасно используется в addfront. Код в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...