此addfront()函数与链接列表的nalloc()一起使用是否错误?
本代码摘自:开放式课程第20-21页此addfront()函数与链接列表的nalloc()一起使用是否错误?,c,pointers,C,Pointers,本代码摘自:开放式课程第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 nod
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()中使用它会产生未定义的行为。我已经看到并相信我是正确的,但有人能证实吗 你说得不对。虽然
p
是堆栈上的局部变量,但它指向的不是。所发生的事情是从nalloc
返回一个指向堆上节点的指针,该指针的副本在addfront
中安全使用。代码很好 功能是正确的。但你的逻辑并没有那么错误。变量p
实际上是本地变量,在函数返回时不再存在。但是,p
不是您用malloc
分配的内存,而是存储您分配的内存地址的变量
因此,语句返回p
将返回p
的副本,因此使用malloc()
分配的内存地址的副本
在链接问题中,用户创建一个本地数组并返回指向该数组的指针。请参见,该数组是本地的,现在使用new
或malloc()
动态分配。所以他的变量实际上包含(自动)分配的内存,而不是它的地址。但是,只返回地址,因此内存丢失。两个函数中的指针p
都指动态分配的内存。从函数返回时,堆栈将被销毁。动态分配的内存位于堆上,即使在函数结束时也是有效的。因此,此代码是正确的。p
是本地的,一旦程序流退出函数nalloc
,它就会被销毁,但它分配的内存即使在nalloc(直到空闲
d)和内存地址(如果)之后也会存在由p
在nalloc
中分配的代码是有效的。您的代码在我看来是正确的。Quibble。不需要强制执行malloc的返回,这是不必要的。请参阅:@DavidC.Rankin有关缺少的头大小写,编译器发出警告:include''或提供“malloc”声明。
它与链接问题中的msg指针有何不同?@Archermsg
是堆栈上的静态数组。当函数返回时,它将被销毁p
指向动态分配的内存,在使用free()
释放之前,可以使用该内存。