동적할당시 이상한 segmentation fault입니다.

rpgame의 이미지

구조체(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(...))
이 추가되는 것으로 해결 가능한 듯 싶습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.