首页 > 解决方案 > 与 nalloc() 一起用于链表的 addfront() 函数是否错误?

问题描述

此代码取自:ocw 的本讲义 pdf第 20-21 页。

 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 是 nalloc() 的本地指针,并且在 addfront() 中使用它会产生未定义的行为。我已经看到了这个问题的答案并相信我是正确的,但有人可以验证吗?

标签: cpointers

解决方案


功能是对的。但是你的逻辑并没有那么错误。该变量p实际上是本地的,并且在函数返回时将不再存在。但是,p不是您分配的内存,而是存储您分配的内存地址的malloc变量。

因此,该语句return p;将返回 的副本,即您使用 分配的内存地址p的副本。malloc()

在链接的问题中,用户创建一个本地数组并返回一个指向它的指针。看,数组是本地new的,现在使用or动态分配malloc()。所以他的变量有效地包含(自动)分配的内存,而不是它的地址。但是,仅返回地址,因此丢失了内存。


推荐阅读