CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ 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); }
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.