(제1장1) 유니버설 쌍방향 체인 테이블 - 리셋 함수

3378 단어 콜백 함수
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란?
반도체를 메모리의 재료로 사용하기 전에 인류는 코일을 메모리의 재료로 삼았다(발명자는 왕안), 코일을 코어라고 하고, 코일로 만든 메모리를 코어 메모리라고 한다.오늘날 반도체 공업이 급속히 발전하여 이미 코어 메모리를 사용하는 사람이 없어졌다. 그러나 많은 상황에서 사람들은 여전히 기억체를 코어라고 부른다.
B. Core Dump이란?
우리가 프로그램을 개발(또는 사용)할 때 가장 두려워하는 것은 프로그램이 영문도 모른 채 넘어가는 것이다.비록 시스템은 괜찮지만, 우리는 다음에도 같은 문제에 부딪힐 수 있다.그래서 이 때 운영체제는 프로그램이 떨어졌을 때의 메모리 내용을dump로 출력합니다. (지금은 보통 코어라는 파일에 쓰여 있습니다.) 우리나 debugger를 참고로 합니다.이 동작을 코어 덤프라고 부른다.
 
컴퓨터 용어에서 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
 
3. printf ()를 사용하려면 #include
 
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;
}

 
 

좋은 웹페이지 즐겨찾기