`

(第一章 1)通用双向链表——回调函数

 
阅读更多

1. Segmentation fault (core dumped):

(1)正确:

 

DListNode *a=(DListNode *)malloc(sizeof(DListNode));
a->data=(void *)2;

(2)错误:

 

DListNode *a;
a->data=(void *)2;

会报错Segmentation fault (core dumped)

 

A. 什么是Core:

在使用半导体作为内存的材料前,人类是利用线圈当作内存的材料(发明者为王安),线圈就叫作 core ,用线圈做的内存就叫作 core memory。如今 ,半导体工业澎勃发展,已经没有人用 core memory 了,不过,在许多情况下,人们还是把记忆体叫作 core 。

B. 什么是Core Dump:

我们在开发(或使用)一个程序时,最怕的就是程序莫明其妙地当掉。虽然系统没事,但我们下次仍可能遇到相同的问题。于是这时操作系统就会把程序当掉 时的内存内容 dump 出来(现在通常是写在一个叫 core 的 file 里面),让 我们或是 debugger 做为参考。这个动作就叫作 core dump。

 

来看看dump在计算机术语中的意思:

V-T To dump computer data or memory means to copy it from one storage system onto another, such as from disk to magnetic tape. 转储[计算机]

 

C.内存越界或者非法地址访问!!! 看看你的数组、字符串、指针,malloc分配的内存区

D.如果使用错误的写法,怎样使用gdb调试呢:

 

[hadoop@sam1 dlist_print]$ g++ -g DList.cpp -o DList
[hadoop@sam1 dlist_print]$ ./DList 
Segmentation fault (core dumped)
[hadoop@sam1 dlist_print]$ gdb
(gdb) file DList
Reading symbols from /home/hadoop/Desktop/testGCC/dlist_print/DList...done.
(gdb) run
Starting program: /home/hadoop/Desktop/testGCC/dlist_print/DList 

Program received signal SIGSEGV, Segmentation fault.
0x080484a5 in main () at DList.cpp:68
warning: Source file is more recent than executable.
68		a->data=(void *)2;
(gdb) 
(gdb) where	可以看到程序在哪里down掉的
#0  0x080484a5 in main () at DList.cpp:68

 

2. 使用malloc()需要#include <stdlib.h>

 

3. 使用printf()需要#include <stdio.h>

 

4. 编译和运行

[hadoop@sam1 dlist_print]$ g++ DList.cpp -o DList

[hadoop@sam1 dlist_print]$ ./DList 

23

 

简化代码:

 

#include <stdio.h>
#include <stdlib.h>

//通用双向链表
typedef int DListRet;
typedef DListRet (*DListDataPrintFunc)(void *data);
#define DLIST_RET_OK 1
#define DLIST_RET_STOP 2

typedef struct _DListNode{
	struct _DListNode* prev;
	struct _DListNode* next;
	void* data;
}DListNode;

typedef struct _DList{
	DListNode *first;
}DList;

//"被调用函数"
//DListRet dlist_print(DList *list, DListDataPrintFunc printFun);
DListRet dlist_print(DList *list, DListDataPrintFunc printFun){
	DListNode *iter=list->first;
	while(iter!=NULL){
		printFun(iter->data);
		iter=iter->next;
	}
}


//"回调函数"
//DListRet print_int(void *data);
DListRet print_int(void *data){
	printf("%d",(int)data);
	return DLIST_RET_OK;
}

int main(){
	//初始化双向链表
	DListNode *a;	
	DListNode *b=(DListNode *)malloc(sizeof(DListNode));

	a->data=(void *)2;
	b->data=(void *)3;
	a->next=b;
	a->prev=NULL;
	b->next=NULL;
	b->prev=a;

	DList *list=(DList *)malloc(sizeof(DList));
	list->first=a;

	//调用
	dlist_print(list,print_int);

	return 0;
}

 

 

 

分享到:
评论

相关推荐

    双向链表——1

    这是一个双向链表,非常的可以。主要有3个头文件,10多个实现文件,还有一个主函数文件,希望大家多多支持!

    通用双向链表以及内存检漏算法

    总结起来,这个项目提供了一个实际的案例,展示了如何在C语言中实现一个通用的双向链表,并结合内存检漏检测算法确保程序的资源效率。通过学习和理解这部分代码,开发者可以深化对数据结构和内存管理的理解,提高...

    通用双向链表

    通用双向链表,数据类型通用化。更高级的做法是节点话,链表节点中剥离数据,这也是软件工程中常用方法。

    双向链表及其应用——实现多项式的加法及乘法

    在乘法运算中,更复杂一些,需要对第一个多项式的每个项遍历第二个多项式,每次乘法得到的新项都加入到结果链表。这个过程类似于矩阵乘法,但每次操作的“行”和“列”都是多项式的项。 项目的测试文件可能会包含...

    C语言实现通用双向链表标准版.rar

    本资源“C语言实现通用双向链表标准版.rar”提供了一个使用C语言实现的通用双向链表实例,这对于理解和掌握数据结构,尤其是链表操作具有重要意义。 双向链表是一种线性数据结构,与单向链表不同,它允许节点在两个...

    支持类模版的C++双向链表

    总结起来,这个“支持类模版的C++双向链表”示例深入地讲解了C++中的模板机制,包括类模版和函数模版的使用,以及如何结合这些模板技术实现一个通用的双向链表。通过这个示例,我们可以更深入地理解泛型编程,以及...

    双向链表的操作

    建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成,数据类型为整型。) Input 第一行:双向表的长度; 第二行:链表中的数据元素。 Output 输出双向链表中...

    通用链表 双向

    自己写的通用双向链表,链表数据存储不区分类型,存储均为指针,有使用事例。现在已实现的功能有链表的创建,插入(前后均可实现),单节点删除,链表...所有的删除、查找条件均使用回调函数,实现不同类型的通用存储。

    java 单链表和双向链表的实现

    本话题主要探讨两种常用的数据结构——单链表和双向链表在Java中的实现,以及相关的操作,如在头部添加节点、在尾部添加节点、遍历、逆置和删除。 首先,我们来理解单链表和双向链表的基本概念。单链表是一种线性...

    C++经典算法 双向链表

    首先,我们需要定义双向链表的基本单元——节点。节点包含三个主要部分:数据域(data)、指向前驱节点的指针(lift)和指向后继节点的指针(right)。这里采用的是C语言的结构体定义: ```c++ typedef struct Link...

    Linux内核双向链表简单分析

    ### Linux内核双向链表简单分析 #### 链表数据结构简介 链表作为一种基本且重要的数据结构,在操作系统及各种软件系统中扮演着至关重要的角色。尤其在Linux内核中,链表更是广泛应用于内存管理、进程调度、文件...

    创建双向链表_双向链表_

    双向链表是一种特殊类型的数据结构,与常见的单向链表相比,它具有更丰富的操作能力,可以支持前后两个方向的遍历。本篇文章将深入探讨如何创建双向链表以及其在增加和删除操作中的应用。 双向链表的每个节点不仅...

    双向链表实现结点类

    定义、实现并测试一个双向链表结点类DNode。 链表结点类中包含私有数据成员为两个整数x,y以及左结点指针left及右结点指针right。 包含的函数成员包括: (a)对结点的数据成员赋值setDNodeValues(int,int,DNode* ...

    双端链表和双向链表Java代码

    本主题主要关注两种特殊类型的链表——双端链表(Double-ended LinkedList)和双向链表(Bidirectional LinkedList),并以Java语言实现为例进行讲解。 双端链表,也称为双链表,是一种允许在链表的两端进行插入和...

    stm32f103 双向链表

    在实际应用中,例如在STM32F103的中断服务程序或定时器回调中,双向链表可以用于管理任务调度、资源分配或者动态内存管理。例如,你可以创建一个任务节点,每个节点包含任务的优先级、状态和执行函数,然后用链表来...

    网上搜集的七种双向链表模板c++实现

    STL(Standard Template Library,标准模板库)提供了一种标准的双向链表容器——`std::list`。这种实现符合C++标准,兼容STL算法,并提供了丰富的操作接口。 在实际应用中,这些模板可能包含额外的功能,如反转...

    数据结构源代码之双向链表

    此函数用于在双向链表的指定位置插入一个新的节点。 ##### 7. 删除双向链表中的第i个结点 ```plaintext int DLinkListDelete(DNode *L, int i, char *elem); ``` 此函数用于删除双向链表中指定位置的节点。 #### ...

    数据结构-双向链表

    1. 插入操作:在双向链表中插入节点,需要考虑插入位置,可能是表头、表尾或者中间某个位置。插入操作涉及修改插入点的前后节点的指针,以确保链表的完整性。 2. 删除操作:删除节点同样需要考虑位置,需要更新被...

    C++双向链表统计文章单词出现频率

    在这个特定的项目中,“C++双向链表统计文章单词出现频率”是一个涉及数据结构和算法的应用,目标是实现一个程序来分析文本文件,计算并显示文章中每个单词出现的次数。双向链表作为数据结构的核心,其特点是每个...

    链表——学生管理系统 MFC

    CList是一个双向链表,支持向前和向后遍历。在这个学生管理系统中,CList可以用来存储一个包含学生信息的对象,如CStudent类的实例。每个CStudent对象可能包括姓名、学号、成绩等属性。 添加功能:通过CList的...

Global site tag (gtag.js) - Google Analytics