c - free() 函数和从“指向非 void 数据类型的指针”到指向 void 数据类型的指针的隐式类型转换
问题描述
在《C Programming: A Modern Approach 》一书中,第 17.4 章介绍了free()
具有以下形式原型的函数:void free(void *ptr)
。由于作者概述了几个涉及动态存储 using 的示例malloc()
,因此遇到了以下准代码片段:
struct node {
int value;
struct node *next;
};
struct node *delete_from_list(struct node *list, int n)
{
struct node *cur, *prev;
.
. /*Will explain the relevant part of this section as it pertains to the question (bullet 3 below) */
.
free(cur); /* <--- my question is about this line */
}
重点是:
- 有一种数据类型称为
struct node
它有两个字段 - 有一个指向
struct node
命名的指针cur
- 在
delete_from_list
函数中,cur
最终会在堆中分配一些地址。特别是,它将被分配给数据类型为 的一块内存struct node
。
确定了这 3 点后,我们可以解决我的问题:为什么free()
使用参数调用函数cur
没有问题?cur
不是指向 void 的类型指针。我假设这意味着发生某种类型的隐式(在引擎盖下)类型转换,将cur
的数据类型从指针更改struct node
为指向 void 的指针。是这样吗?如果是这样,当涉及到函数调用时,是否有关于将指针隐式类型转换为参数的一般规则?
解决方案
任何对象指针类型都可以在void *
没有强制转换的情况下自由转换为 a 或从 a 转换。
C 标准的第 6.3.2.3p1 节规定:
指向的指针
void
可以转换为指向任何对象类型的指针或从指向任何对象类型的指针转换。指向任何对象类型的指针都可以转换为指向void
和返回的指针;结果应与原始指针比较。
此外,该free
函数只能传递一个从malloc
函数族之一返回的指针,并且这些都返回一个void *
.
推荐阅读
- linux - x86 中的分段与 linux 下编译器中的分段
- testing - 如何在 Azure DevOps 中运行未完成时更改其状态
- asp.net-core - 尝试激活“XXXXX”时无法解析“Microsoft.AspNetCore.SignalR.Hub`1[IXXXX]”类型的服务
- java - 使用attributeconverter时,SpringBoot应用程序未完成启动
- php - 为什么我的 ionic 应用程序不显示来自 Android 数据库的数据?
- laravel - 如何模拟 Laravel Auth 门面的给定方法
- javascript - 如何使用 ref 在 react.js 中的两个按钮之间切换?
- openssl - 如何将多个答案传递给 shell 命令?
- javascript - 返回段落中链接的索引位置
- c - 访问指向结构的指针会导致内存读取冲突