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; }
相关推荐
这是一个双向链表,非常的可以。主要有3个头文件,10多个实现文件,还有一个主函数文件,希望大家多多支持!
通用双向链表,数据类型通用化。更高级的做法是节点话,链表节点中剥离数据,这也是软件工程中常用方法。
实现了通用的双向链表的所有操作,可以适用于各种数据结构,并配备了内存检漏算法,保证内存不泄露。
建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成,数据类型为整型。) Input 第一行:双向表的长度; 第二行:链表中的数据元素。 Output 输出双向链表中...
http://msdn.microsoft.com/en-us/library/95z04bas(v=VS.71).aspx 双向链表
自己写的通用双向链表,链表数据存储不区分类型,存储均为指针,有使用事例。现在已实现的功能有链表的创建,插入(前后均可实现),单节点删除,链表...所有的删除、查找条件均使用回调函数,实现不同类型的通用存储。
双向链表
用C语言实现的通用双向链表,格式代码都比较漂亮
定义、实现并测试一个双向链表结点类DNode。 链表结点类中包含私有数据成员为两个整数x,y以及左结点指针left及右结点指针right。 包含的函数成员包括: (a)对结点的数据成员赋值setDNodeValues(int,int,DNode* ...
定义了线性表的抽象类,以及双向链表类及其结点类,实现双向链表的基本功能,还进一步应用到一元多项式的储存、加法和乘法,里面包含了项目文件,测试文件以及报告文件(一元多项式实现的思路)。
数组和链表——精选推荐 数组和链表.pdf
详细的介绍了Linux内核中使用的最频繁的双向链表
二元查找树转变成排序...输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。
一种支持类模版和函数模版的C++双向链表,实现了各种排序算法(排序原则可定制),包含学生信息的使用示例(VC 6.0、VS2008).
双向链表类定义及测试文件 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材
本程序就是为了解决这个问题,将双向链表的基本操作写成了一套通用程序,不管你的链表长什么样子,都可以使用它来帮你完成节点的插入、删除等操作,大幅度减轻编程工作量,让你可以将注意力集中到链表中其他的数据...
2.用双向链表做数据结构,编写一个通信录管理系统。本系统应完成以下几方面的功能。 输入信息——enter(); 显示信息——display(); 查找以姓名作为关键字——search(); 删除信息——delete(); 存盘——...
通过建立双向链表,来实现双向查找,增加和删除的功能
实现双向链表的增删改查功能,dos窗口输入输出,可运行,有注释