c - 与 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() 中使用它会产生未定义的行为。我已经看到了这个问题的答案并相信我是正确的,但有人可以验证吗?
解决方案
功能是对的。但是你的逻辑并没有那么错误。该变量p
实际上是本地的,并且在函数返回时将不再存在。但是,p
不是您分配的内存,而是存储您分配的内存地址的malloc
变量。
因此,该语句return p;
将返回 的副本,即您使用 分配的内存地址p
的副本。malloc()
在链接的问题中,用户创建一个本地数组并返回一个指向它的指针。看,数组是本地new
的,现在使用or动态分配malloc()
。所以他的变量有效地包含(自动)分配的内存,而不是它的地址。但是,仅返回地址,因此丢失了内存。
推荐阅读
- android - DialogFragment 中的 Spinner 未触发 setOnSelectedItemListener
- django - get_%field%_display 没有实例
- php - 将 PHP 转换为 Codeigniter 框架
- php - 使用模板将数据从控制器传递到视图
- javascript - 单击行时选中复选框 angular 4
- c# - 如何在 Windows 10(10 月更新)中获取剪贴板历史记录?
- php - Laravel 5.2 在用户注册时上传图片到上传文件夹
- linux - 如果文件在linux的子目录中不存在,则检索父目录名称的命令
- python - 如何使用 Sympys NumPyPrinter?
- git - 尝试克隆存储库时出现 Git 认证错误