프로그래밍 중에 좀처럼 벗어나지 못하는 실수...
C 프로그래밍을 해온지 상당한 세월이 지났다고 자부하는 지라, 이제는 웬만한 프로그래밍 오류에는 빠지지 않는데 좀처럼 벗어나지 못하고 툭하면 빠지는 함정이 있습니다.
타입선언.
typedef struct {
char emp_no[8];
char name[16];
char post[8];
char email[64];
} user_t;
변수선언
user_t *usr_arr_p, *usr_p;
동적메모리 할당.
usr_arr_p = malloc (usr_arr_no * sizeof(user_t));
DB에서 데이터 Loading...
while ((row = mysql_fetch_row (res)) != NULL && i < usr_arr_no)
{
usr_p = usr_arr_p + (i * sizeof(user_t));
strcpy (usr_p->emp_no, row[0]);
strcpy (usr_p->email, row[1]);
strcpy (usr_p->post, row[2]);
strcpy (usr_p->name, row[3]);
i++;
}
이렇게 간단한 동작을 시키는 프로그램을 짰는데, 읽어야 할 데이터가 50개인데, 5개만 읽고는 Segmentfalut 가 떨어지는 것입니다. 디버거로 걸어보고, 할당된 메모리를 체크해 봐도 도저히, 메모리를 침범한것 같지 않는데, Segmentfalut 원인을 찾을수가 없었습니다.
뭐가 문제였을까요?
문제점을 찾으셨나요? ^^;;
문제점은
usr_p = usr_arr_p + (i * sizeof(user_t));
가 문제 였습니다.
usr_arr_p 가 struct user_t 타입이기 때문에 거기에 인덱스값을 추가하면 sizeof(user_t)*i 의 오프셋 만큼 증가하는 것이 었습니다. 저는 (i * sizeof(user_t) * sizeof(user_t)) 의 크기만큼 증가하는 것이었습니다.
수정된 것은
usr_p = usr_arr_p + i;
가 맞습니다.
포인터를 사용할 때, 항상 char 단위의 크기가 머리속에 박혀 있다는 것이 문제가 아닌가 싶습니다.
이 간단한 문장을 3시간동안을 찾아 헤메다가, 결국은 해결을 못하고, 직원에게 도와달라고 해서, 그 직원에게 설명하면서 "맞어!" 하고는 10분만에 깨닳았습니다.
자기기만 버그라고 하던가요? --;;
- 겨울아찌 -
컴퓨터가 아니라
컴퓨터가 아니라 사람이라서 그런 모양입니다..
저도 평소에 절대 안할것 같은 실수를 가끔씩하고 삽질 하는 경우가 있습니다. ㄱ-
http://dcple.com/blog/index.php?pl=131&ct1=1
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
댓글 달기