`

(第一章 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多个实现文件,还有一个主函数文件,希望大家多多支持!

    通用双向链表

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

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

    实现了通用的双向链表的所有操作,可以适用于各种数据结构,并配备了内存检漏算法,保证内存不泄露。

    双向链表的操作

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

    双向链表双向链表双向链表

    http://msdn.microsoft.com/en-us/library/95z04bas(v=VS.71).aspx 双向链表

    通用链表 双向

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

    双向链表双向链表

    双向链表

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

    用C语言实现的通用双向链表,格式代码都比较漂亮

    双向链表实现结点类

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

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

    定义了线性表的抽象类,以及双向链表类及其结点类,实现双向链表的基本功能,还进一步应用到一元多项式的储存、加法和乘法,里面包含了项目文件,测试文件以及报告文件(一元多项式实现的思路)。

    数组和链表——精选推荐 数组和链表.pdf

    数组和链表——精选推荐 数组和链表.pdf

    Linux内核双向链表简单分析

    详细的介绍了Linux内核中使用的最频繁的双向链表

    微软面试题——二元查找树转变成排序的双向链表

    二元查找树转变成排序...输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。

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

    一种支持类模版和函数模版的C++双向链表,实现了各种排序算法(排序原则可定制),包含学生信息的使用示例(VC 6.0、VS2008).

    双向链表.cpp 双向链表类定义及测试代码 c++

    双向链表类定义及测试文件 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材

    双向链表通用管理程序(添加节点、删除节点等等)

    本程序就是为了解决这个问题,将双向链表的基本操作写成了一套通用程序,不管你的链表长什么样子,都可以使用它来帮你完成节点的插入、删除等操作,大幅度减轻编程工作量,让你可以将注意力集中到链表中其他的数据...

    用双向链表做数据结构,编写一个通信录管理系统。

    2.用双向链表做数据结构,编写一个通信录管理系统。本系统应完成以下几方面的功能。 输入信息——enter(); 显示信息——display(); 查找以姓名作为关键字——search(); 删除信息——delete(); 存盘——...

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

    通过建立双向链表,来实现双向查找,增加和删除的功能

    双向链表的增删改查

    实现双向链表的增删改查功能,dos窗口输入输出,可运行,有注释

Global site tag (gtag.js) - Google Analytics