포인터에 관한 문제...
글쓴이: bakdorazi / 작성시간: 월, 2010/01/25 - 5:11오후
struct examTable_entry{ char name; char old_name ; long num1; long old_num1; long num2; long old_num2; int valid; struct examTable_entry * next; };
위의 구조체 값을 아래의 함수에 대입할 때
int snmp_set_var_value ( netsnmp_variable_list * vars, const void * value, size_t len)
netsnmp_variable_list 구조체는 아래와 같습니다.
struct variable_list * next_variable NULL for last variable. oid * name Object identifier of variable. size_t name_length number of subid's in name u_char type ASN type of variable. netsnmp_vardata val value of variable size_t val_len the length of the value to be copied into buf oid name_loc [MAX_OID_LEN] 90 percentile < 24. u_char buf [40] 90 percentile < 40. void * data (Opaque) hook for additional data void(* dataFreeHook )(void *) callback to free above int index
아래의 함수에서 표시한 부분이 에러가 납니다.
netsnmp_variable_list * examTable_get_next_data_point(void **my_loop_context, void **my_data_context, netsnmp_variable_list * put_index_data, netsnmp_iterator_info *mydata) { struct examTable_entry *entry = (struct examTable_entry *)*my_loop_context; netsnmp_variable_list *idx = put_index_data; if (entry) { snmp_set_var_value(idx, (u_char *)entry->name, strlen((u_char *)entry->name)); <== 이 부분에서 에러가 납니다. idx = idx->next_variable; *my_data_context = (void *) entry; *my_loop_context = (void *) entry->next; } else { return NULL; } }
위의 부분에서 snmp_set_var_value(idx, (u_char *)entry->name, strlen((u_char *)entry->name));
이 부분에서 에러가 납니다.
제가 표시한 부분 외의 다른 부분은 mib2c를 이용해서 NEXCOMM-EXAM-MIB을 이용해서 생성한 소스 입니다.
그러므로 큰 의미를 두시지 않으셔도 될 듯 싶습니다.
제가 추가해 준 부분에서 에러가 나는데요...
내용은 그렇다 치고 데이터 형이 실제 정의한 형이랑 일치하는 지 여부를 판단해 주시면 될 것 같습니다.
제가 포인터가 좀 약하다 보니..이 부분이 제일 어렵네요..
유치한 질문이라고 덮어두지 마시고..아시는 분은 좀 도와주세요..
Forums:
char를 u_char*로
char를 u_char*로 변환할수 있다고 생각하시는 근거가 있나요?
형변환은 만능처럼보이지만 아무것도 해결해주지 않습니다.
형변환은 적당한 변환인지 확신이 있을때만 해야합니다.
그리고 에러가 나면 에러를 올려주세요.
아래 링크에
아래 링크에 보시면
snmp_set_var_value를 사용하는 방법에 대해서 나오는데요..
http://www.google.co.kr/codesearch/p?hl=ko#pFm0LxzAWvs/darwinsource/tarballs/other/net_snmp-10.tar.gz%7CqhDAwLBEFkg/net_snmp-10/net-snmp/snmplib/snmp_client.h&q=snmp_set_var_value
int snmp_set_var_value(struct variable_list *, u_char *, size_t);
이렇게 되어 있습니다. 그래서... 위의 함수에 대입하는 2번째 인자값을 u_char * 로 형변환을 해서 썼습니다.
에러는 아래와 같습니다.
위의 에러에서 exam.c:237 이라는 곳이 제가 에러나는 곳이라고 표시한 부분이구요.
밑에 241줄도 위와 같이 제가 형변환 한 곳입니다.
warning만 났지만 생성된 실행파일 nex를 실행해보면 세그멘테이션 오류 일어납니다.
코드 전체가 궁금하긴 합니다만...
우선 타입케스팅에 대해서는 경고만 발생 했고...세크먼트 폴트의 직접적인 원인은 아닌 거 같습니다.
gdb나 core dump 해 보셔서 정확하게 에러가 나는 포인트를 확인 하시는게 좋을것 같군요...
제 생각에도...name, old name 머 이런 구조체 변수가 포인터가 아닌게 맘에 걸리는 군요...이름이 'A' 한글자도 아닐꺼이고 ^^
여튼..gdb로 디버깅해 보세요...메모리 참조 에러 같아 보입니다.
============================
Stay Hungry, Stay Foolish
============================
Stay Hungry, Stay Foolish
답글 달아주셔서 감사합니다.
님 말씀대로 gdb로 디버깅 중인데...
잘 안되는 군요...
소스 코드를 전체 올립니다.
앞서 말씀드렸다시티 위의 소스 대부분은 mib2c 컴파일러로 생성한 소스이며 제가 추가한 부분은 얼마되지 않습니다.
올린 소스에 제가 추가한 부분에 대한 코멘트를 하였습니다..
말씀해 주신 것 참조하여 소스를 수정한 결과 세그먼트오류는 발생하지 않지만 역시나 Failed Object가 발생하고 있습니다.
제가 잘 몰라서 그러니...다시 한 번 봐주시면 좋겠어요...
계속 수정의 수정을 거듭하지만 정말 안되네요...
음냐....^^;
우선 다음 코드는 주의 하셔야 합니다.
/////////////////////////////////////////////
char *ffname;
int lens = sprintf(ffname, "nex");
/////////////////////////////////////////////
size = 필요한 크기 + 1;
char ffname[size];
int lens = sprintf(ffname, "nex");
그리고 수정하셨다는 부분 보면 아래 함수를 호출하는대...넘겨 주는 값 검증을 한번 해 보심이...
아래 함수가 어떻게 구현되어 있는지는 모르겠으나...더이상 제가 봐 드리기는 힘드네요 ㅋㅋ 저도 과업이 있고...그닥
실력이 출중 하지 못하여...^^ 수고 하세요
snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR,
(u_char *)ffname,
lens);
============================
Stay Hungry, Stay Foolish
============================
Stay Hungry, Stay Foolish
struct examTable_entry{
struct examTable_entry{
char name;
int num1;
int num2;
};
char name 이 아니라 char *name 이 아닐까요?
제 생각에도 char name-> char *name
이어야 한다고 생각하는데요
앞서 말했듯이
위의 소스는 mib2c라는 걸로 생성한 소스입니다.
그래서 위의 구조체도 mib2c가 만든 거거든요...
제가 추가한 부분은 위에 표시한 부분밖에 없습니다.
char *name이 되어야 할 것 같은데 char name로 해서 소스를 수정하려고 하니 자꾸 문제가 생기는 것 같애요...
댓글 달기