동적할당시 이상한 segmentation fault입니다.
구조체(process_code_block)를 포함하는 queue(pcbQ)를 관리하는 부분입니다
초기화한후 삽입하는 부분에서 segmentation fault가 발생합니다.(리눅스)
다음 코드는 해당부분만 발췌한것입니다.
큐가 구조체를 data로 갖고 있어 head pointer를 이용해 큐에 구조체를 삽입하려합니다
insertQ(pcbQ *head, process_code_block *pcb_temp);
insertQ(pcbQ *head, process_code_block *pcb_temp2);
위와 같이 두개의 임시 data를 만들어서 테스트해보았습니다.
두번째 insertQ가 수행될 때, segmentation fault가 발생하고 디버깅해본 결과가 좀 이상합니다.ㅠㅠ
첫번째 insertQ가 시작되면 루틴내의 지역변수로 *temp, *node를 선언하구요, temp는 삽입될 대상이므로 malloc으로 동적할당 합니다. 해서 처음이기때문에 head->link는 NULL이고, head 다음으로 삽입됩니다. 다시 main으로 돌아와서 두번째 임시data를 큐에 넣으려고 합니다. 다시 insertQ로 진입하게 되고 마찬가지로 *temp, *node를 선언합니다.
!!!!! 그런데 여기서 문제가 발생합니다. !!!!!
다시 선언된 *temp에서 temp의 값(주소값)이 첫번째 insertQ가 수행될때 선언된 temp의 값과 같은 값입니다. (ㅠㅠ) 그 때문에 다음 malloc에서는 segmentation fault가 발생됩니다.(그런것으로보입니다...)
static하게 선언한 것도 아닌데 왜 저렇게 되는지 잘 모르겠습니다. 고수분들의 도움을 부탁드립니다.
int main(void) { pcbQ *rqHead; pcbQ *wqHead; rqHead = (pcbQ *)malloc(sizeof(pcbQ)); wqHead = (pcbQ *)malloc(sizeof(pcbQ)); rqHead->link = NULL; wqHead->link = NULL; process_code_block *pcb_temp, *pcb_temp2; pcb_temp = (process_code_block *)malloc(sizeof(process_code_block)); pcb_temp->state = NEWP; pcb_temp->lifeTime = 50; pcb_temp->Priority = 15; pcb_temp->orgnlPrior= 10; pcb_temp->elapseTime= 0; pcb_temp2 = (process_code_block *)malloc(sizeof(process_code_block)); pcb_temp2->state = RUNP; pcb_temp2->lifeTime = 100; pcb_temp2->Priority = 30; pcb_temp2->orgnlPrior= 20; pcb_temp2->elapseTime= 1; insertQ(rqHead, pcb_temp); insertQ(rqHead, pcb_temp2); return 0; } void insertQ(pcbQ *head, process_code_block *pcb) { pcbQ *temp, *node; temp = (pcbQ *)malloc(sizeof(pcbQ)); pcb_copy(pcb, temp->pcb); if (head->link != NULL){ node = head; while(node->link != NULL){ printf("insert where for 2\n"); node = node->link; } node->link = temp; temp->link = NULL; }else{ head->link = temp; temp->link = NULL; } }
자문자답
죄송합니다. 질문 내용이 부족해 아무도 답변이 없으셨습니다.
혹시 비슷한 문제를 겪으실까 해서 지우진 않겠습니다.
잘못된것은 질문중에 표시 안한 code중
"pcb_copy"부분에서 temp내부의 구조체인 pcb를 동적할당하지 않아,
program stack에 마구 쓰여져있어서 그리 된것으로 보입니다.
따라서 pcb_copy 전에
temp->pcb = (process_code_block *)malloc(sizeof(...))
이 추가되는 것으로 해결 가능한 듯 싶습니다.
댓글 달기