2025_2_4 C语言中关于free函数及悬空指针,链表的一级指针和二级指指针

1.free函数

  • free函数所接受的参数只能是动态分配出来的内存,,否者free的行为是未定义的
  • 同一片内存空间不能被free两次

free过后的内存可能会引发悬空指针的问题

2.悬空指针

悬空指针的问题主要是free过后的内存空间,原先指向这片空间的指针没有做处理,这个指针就是悬空指针,因为它指向的内存空间已经被free了

悬空指针问题很难被发现,因为可能有多个指针指向被free的内存空间,这些指针就都变成悬空指针了

cpp 复制代码
char* p = malloc(10);
char* q = p;

free(p);
//p和q都是悬空指针了,下面两个操作会出错
strcpy(p, "abc");
strcpy(q, "dcf");

调用了strcpy(p, "abc")和strcpy(q, "dcf")。这两个操作都是试图向已经被释放的内存中写入数据。由于内存已经被释放,程序不再拥有这块内存的所有权,此时写入操作是非法的

所以,处理悬空指针的方法就是将其重新复制为NULL

cpp 复制代码
char* p = malloc(10);
char* q = p;
free(p);

p = NULL:
q = NULL;

3.链表的一级指针和二级指指针

宗旨:想修改哪个变量,就传递哪个变量的地址

  1. 修改指针变量指向的对象------>一级指针

    比如:
    遍历链表
    修改节点数据
    删除/插入中间或尾部节点(通过前驱节点操作)

  2. 修改指针变量的值(指针变量的指向)------>二级指针
    比如:
    头插法插入节点(修改头指针指向新节点)
    删除头节点(头指针需指向下一个节点)
    初始化空链表(首次插入节点时需修改头指针)

指针变量存储的是内存地址,当我们将指针作为参数传递给函数时,实际上是传递了该指针的副本。如果函数内修改了这个副本指向的内容,那么原指针指向的内容也会被修改,因为副本和原指针指向同一块内存。但如果需要修改指针本身(即让指针指向另一个地址),则需要传递指针的指针,也就是二级指针,这样函数才能修改原指针的值。

cpp 复制代码
typedef struct node_s {
	int date;
	struct node_s* next;
}node;

node* add_node(node** plist, int date) {
	//创建节点空间
	node* new_node = malloc(sizeof(node));
	if (new_node == NULL) {
		printf("add_node faild in add_node!\n");
		exit(1);
	}
	//头插法
	new_node->date = date;
	new_node->next = *plist;
	*plist = new_node;
	//返回头指针
	return *plist;
}

int main() {
	node* list = NULL;
	//list可以接收头指针
	add_node(&list, 1);
	add_node(&list, 2);
	add_node(&list, 3);
	add_node(&list, 4);
	return 0;
}

上述代码在插入结点的时候用到的是头插法,需要改变头节点的指向,所以要传递二级指针。

相关推荐
badhope15 小时前
Mobile-Skills:移动端技能可视化的创新实践
开发语言·人工智能·git·智能手机·github
码云数智-园园16 小时前
微服务架构下的分布式事务:在一致性与可用性之间寻找平衡
开发语言
C++ 老炮儿的技术栈17 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
hz_zhangrl17 小时前
CCF-GESP 等级考试 2026年3月认证C++一级真题解析
开发语言·c++·gesp·gesp2026年3月·gespc++一级
Liu6288817 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
IT猿手17 小时前
基于控制障碍函数的多无人机编队动态避障控制方法研究,MATLAB代码
开发语言·matlab·无人机·openclaw·多无人机动态避障路径规划·无人机编队
AI科技星17 小时前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证
c语言·开发语言·人工智能·opencv·算法·机器学习·数据挖掘
sunwenjian88618 小时前
Java进阶——IO 流
java·开发语言·python
波特率11520018 小时前
const关键字与函数的重载
开发语言·c++·函数重载
FL162386312918 小时前
[C#][winform]segment-anything分割万物部署onnx模型一键抠图演示
开发语言·c#