Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
此addfront()函数与链接列表的nalloc()一起使用是否错误?_C_Pointers - Fatal编程技术网

此addfront()函数与链接列表的nalloc()一起使用是否错误?

此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

本代码摘自:开放式课程第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()中使用它会产生未定义的行为。我已经看到并相信我是正确的,但有人能证实吗

你说得不对。虽然
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指针有何不同?@Archer
msg
是堆栈上的静态数组。当函数返回时,它将被销毁
p
指向动态分配的内存,在使用
free()
释放之前,可以使用该内存。