(第一章 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;
}

 

 

 

你可能感兴趣的:(回调函数)