当前位置: 首页 > article >正文

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

1.free函数

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

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

2.悬空指针

悬空指针的问题主要是free过后的内存空间,原先指向这片空间的指针没有做处理,这个指针就是悬空指针,因为它指向的内存空间已经被free了
悬空指针问题很难被发现,因为可能有多个指针指向被free的内存空间,这些指针就都变成悬空指针了

char* p = malloc(10);
char* q = p;

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

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

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

char* p = malloc(10);
char* q = p;
free(p);

p = NULL:
q = NULL;

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

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

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

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

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

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

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;
}

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


http://www.kler.cn/a/532879.html

相关文章:

  • BGP路径属性
  • swagger使用指引
  • e2studio开发RA2E1(5)----GPIO输入检测
  • 系统URL整合系列视频二(界面原型)
  • 如何安全地管理Spring Boot项目中的敏感配置信息
  • 996引擎-怪物:Lua 刷怪+清怪+自动拾取
  • 【Block总结】CoT,上下文Transformer注意力|即插即用
  • IIC重难点-2
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter2-HTML 中的 JavaScript
  • mysql 学习7 DCL语句,用来管理数据库用户,控制数据库的访问权限
  • k8s二进制集群之各节点部署
  • 【华为OD-E卷 - 跳格子2 100分(python、java、c++、js、c)】
  • Git 的安装与基本配置
  • 使用开源项目:pdf2docx,让PDF转换为Word
  • Activity相关学习(一)
  • 进程及从Linux分析进程
  • 25.02.04 《CLR via C#》 笔记14
  • PyQt4学习笔记2】Qt 的 Model/View 架构
  • c++ 程序计算圆的面积(Program to find area of a circle)
  • Vue3 插槽系统详解
  • PyQt4学习笔记3】QDockWidget
  • 基于多智能体强化学习的医疗AI中RAG系统程序架构优化研究
  • Linux的简单使用和部署4asszaaa0
  • 探索 Copilot:开启智能助手新时代
  • Django框架的全面指南:从入门到高级
  • HarmonyOS_如何字体跟随系统