[ CnUnix ] in KIDS 글 쓴 이(By): HellCat ((void*)0) 날 짜 (Date): 1994년04월10일(일) 10시18분24초 KST 제 목(Title): [A] 뽕조비의 포인터 일반 포인터 문제 같네요. 즉.. 정의 할때 struct node { some_type data; struct node *a,*b,c*,*d; } 뭐 대충 이렇게 했다고 할때.. struct node *xxx; 가 있고 그안에 포인터 링크를 줄줄이 쪼차당기려면 xxx = xxx->a 같은 형태로 나가야죠. 즉 이건 일반 포인터 룰인데.. char *p; 이렇게 하고 char buf[BUFSIZ]; 라고 했다면. for (p = buf, i = 0; (*p) && (i < BUFSIZ); p++, i++) 이런식으로 위의 버퍼를 pointer p 로 가르쳐서 즉 예를 들면 포인터 p 가 마우스 포인터라고 생각하고 buf 안의 한바이트씩 움직여 나간다고 생각하시면 됩니다. 즉 포인터 p 는 p = buf 를 해줌으로서 캐랙터 어레이 buf 의 제일 시작 부분 주소를 가지게 됩니다. 그리고 만약 그 주소안에 내용물을 refer 하려면 *p 를 사용하면 내용물을 refer 할수 있지요. 그리고 p++ 는 현제 p 의 주소에다가 sizeof(char*) 를 더해주는 겁니다. 그래서 한개의 데이타 엘레먼트를 건너뛰는 주소로 포인터 p 를 이동하는 겁니다. 비슷한 개념으로 some_struct_type *left, *right; 이렇게 스트럭져 안에 링크 필드가 들어가 있을경우 우선 노드를 더할때 처음에는 그 링크 필드가 NULL 루 넣어줘서 그 노드 엘레먼트가 single 임을 강조 하고 그러고 그걸 bin. tree 에 낑겨 넣어 주면서 링크를 만들어 준다고 했을때.. 그걸 왼쪽 sub-tree 로 트래버스 할땐 그냥 t = t->left; 를 해줌으로서 현제 포인터가 그 왼쪽 sub-tree 의 주소를 가지게끔 해주는 것입니다. 또 아예 두단계 이동하려면 t = t->left->left; 하면 되고 스트럭처 포인터를 사용하지 않고 스트럭처를 사용하려면 struct node *t; struct node elt; 이렇게 했을때 elt = *(t->left->right->left->right); 그리고 나서는 elt.data 이런식으로 사용할수 있죠. 물론 항상 포인터 오퍼레이션에서 중요한 것은 그 포인터가 원하는 주소..즉 제대로 원하는 데이타의 번지수를 가지고 있는가 체크를 해야 하는 것입니다. 즉..만약 위의 t->left->right->left 가 NULL 다시말해 t->left->rigth 가 leaf 노드 일때. 그걸 모르고 t->left->rigth->left->어쩌고 한다던지 *(t->left->right->left) 를 한다던지 하는것은 주소가 NULL 인 메모리 장소의 내용물을 슬쩍 보겠다고 주장하는 경우니 실패할수 밖에 없죠 대부분 이런경우는 세그멘테이션 바이올레이션으로 되죠. 또한 흔히 하는 실수는 uninitialized pointer 의 내용물을 refer 하려고 할때도 같은 경우입니다. 쓸데없이 말이 길어 졌는데..이 문제는 제 생각에는 포인터 오퍼레이션에선 상당히 기본적인 것이라 사람들이 답을 잘 안해줄꺼 같아서.. (괜히 그런 생각이 들더 라고요..) 잠시 헛소리를 했어요. 거 왜 괜히 상당히 기본적인 거 답하려면 좀 쑥수럽고 해서요.. --- if (t_snddis(KIDS[i].fd, (struct t_call *)NULL) == -1) { t_error("날 죽여라!!"); longjmp ((jmp_buf) HELL, -1); } |