首页 > 解决方案 > 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 */
}

重点是:

  1. 有一种数据类型称为struct node它有两个字段
  2. 有一个指向struct node命名的指针cur
  3. delete_from_list函数中,cur最终会在堆中分配一些地址。特别是,它将被分配给数据类型为 的一块内存struct node

确定了这 3 点后,我们可以解决我的问题:为什么free()使用参数调用函数cur没有问题?cur不是指向 void 的类型指针。我假设这意味着发生某种类型的隐式(在引擎盖下)类型转换,将cur的数据类型从指针更改struct node为指向 void 的指针。是这样吗?如果是这样,当涉及到函数调用时,是否有关于将指针隐式类型转换为参数的一般规则?

标签: cpointerscasting

解决方案


任何对象指针类型都可以在void *没有强制转换的情况下自由转换为 a 或从 a 转换。

C 标准的第 6.3.2.3p1 节规定:

指向的指针void可以转换为指向任何对象类型的指针或从指向任何对象类型的指针转​​换。指向任何对象类型的指针都可以转换为指向void和返回的指针;结果应与原始指针比较。

此外,该free函数只能传递一个从malloc函数族之一返回的指针,并且这些都返回一个void *.


推荐阅读