[완료]void* 에 구조체 포인터의 링크에 대해 질문드립니다.
글쓴이: tibetanwolf87 / 작성시간: 월, 2009/11/23 - 10:28오후
//테이블 엔트리 구조체 입니다.
typedef struct _tblEntry {
BOOL valid; // valid, invalid
ObjectType type; // object type
void* pObj; // pointer to object
}
TblEntry;
//Thread Object 구조체입니다.
typedef struct __ObjThread{
DWORD threadId;
int threadCnt;
}ObjThread;
TblEntry* pTblEntry;
ObjThread* pObjThread;
여기서 구조체 안에있는 void* pObj에 struct __ObjThread 의 포인터를 연결하고 싶은데
계속 세그먼트 오류가 나서 질문을 드립니다.
단순히 pTblEntry->pObj=pObjThread;
를 하면 될 것 같은데 계속 세그먼트 오류가 나옵니다.
void pointer는 모든 형을 받을 수 있는 것 아닙니까?
질문에 답변에 해주시면 감사하겠습니다.
Forums:
void * 형은 모든
void * 형은 모든 데이터 타입의 변수를 다 가르킬 수 있습니다.
따라서 여기서 문제가 발생하지는 않습니다.
pTblEntry가 포인터형이던데
혹시 다음 코드가 실행되기 전에
pTblEntry->pObj=pObjThread;
pTblEntry에 메모리는 할당하거나
혹은 다른 TblEntry 타입의 변수를 가리키도록 하셨습니까?
보통 세그먼트 폴트는 쓸 수 없는 메모리 영역에 쓰기를 시도할때 잘 일어납니다.
앞 부분에 대한
앞 부분에 대한 설명이 빠져있었는데요.
앞에 pTblEntry는 static으로 선언한 hdTable[HANDLE_COUNT_MAX]들 중에 하나의 구조체와연결하였구요
그 둘의 구조체형은 TblEntry로 모두 똑같아요 선언을 한 곳만 다르구요.
그리고 pObjThread는 malloc으로 heap에 할당하였습니다.
혹시 static 영역에 있는 값을 heap 영역의 포인터로 연결하려고 해서 그런건가요?
죄송하지만 다시 한번 답변 부탁드립니다.
감사합니다.
포인터로 가리키는
포인터로 가리키는 것 자체로는 보통 문제가 발생하진 않습니다.
보통 그 포인터로 잘못된 메모리 주소를 참조하거나
혹은 쓰기를 시도할 때 문제가 발생합니다.
pTblEntry 에 쓰기를 시도하는 시점에 pTblEntry가 가리키는 변수가 제대로 존재하는지
혹은 그 시점에 pTblEntry가 제대로 원하는 변수를 가리키는지를
디버거로 확인하시거나 혹은 printf문으로 주소값으로 찍어보면서
확인을 하시는 수밖에 없을듯...
간단하게 답변할 수 없는 경우 segfault 에러가 나는 code를 올려주면 답변에 도움됩니다.
위 올려주신 structure type만 가지고 쉽게 말할 수 있는 상황이 아니군요.
실제 작업 코드의 크기가 크다면 에러 발생 재현이 가능한 코드로 간단한 예제를 올려주셔도 됩니다.
추가로 compiler, os 정보 제공도 도움이 됩니다.
늦어지만... 제가 실수한 것을 알려드립니다...
전체 소스를 보여들려야 하는데
안 보여드렸습니다.
처음에 __clone을 사용해서 프로세스를 생성하는데요
거기서 메모리 공유 옵션을 안주어서(clone_vm)
malloc 을 하여도 접근을 못했었습니다.
그래서 디버깅 하였을 때 세그멘테이션 오류가 났던 것 이구요..
답변에 주셔서 감사합니다.
댓글 달기