为什么此代码会导致分段错误

时间:2017-04-10 18:30:36

标签: c

这是dubugging时的错误

  

编程接收信号SIGSEGV,分段故障。 [切换到   线程0x7ffff6ff5700(LWP 17504)] 0x000000000040124c在推送中   (q = 0x7ffff6ff4ec0,n = ...)在discover.h:27 27
  Q-> TailCpuNode->接着=温度;

    typedef struct CpuNode
        {   
        struct CpuNode *next;
        int cpuid;
        }CpuNode;

        typedef struct List
        {   struct CpuNode *HeadCpuNode;
            struct CpuNode *TailCpuNode;

        }List;

        inline static void push(struct List *q,CpuNode *n){
        struct CpuNode *temp;                       

         temp= (struct CpuNode *)malloc(sizeof(struct CpuNode));
         temp->cpuid=n->cpuid;
         temp->next=NULL;
         if (q->HeadCpuNode==NULL) q->HeadCpuNode=q->TailCpuNode=temp;
         else {
              q->TailCpuNode->next=temp;
              q->TailCpuNode=temp;
            }   
        }

        void Discover(struct List *Acqcores){
         struct CpuNode *temp;
         temp= (CpuNode *)malloc(sizeof(struct CpuNode));
         temp->cpuid=1;
         push(Acqcores,temp);
        }



    int main(int argc, char **argv) {
    struct List Acq_cores;
    Discover(&Acq_cores);
}

2 个答案:

答案 0 :(得分:1)

您没有初始化Acq_cores,因此您可以访问未初始化的变量。这是未定义的行为,可能会导致崩溃。

尝试:

struct List Acq_cores = {NULL, NULL};

除此之外,您还有内存泄漏。改为:

    void Discover(struct List *Acqcores){
     struct CpuNode *temp;
     temp= (CpuNode *)malloc(sizeof(struct CpuNode));
     temp->cpuid=1;
     push(Acqcores,temp);
     free(temp);            // Add this
    }

一般来说,你会做得更好:

    void Discover(struct List *Acqcores){
     struct CpuNode temp;
     temp.cpuid=1;
     push(Acqcores,&temp);
    }

在此处查看演示http://ideone.com/rIYknh

答案 1 :(得分:0)

这些代码行存在问题:

  CpuNode temp;
  temp= malloc(sizeof(CpuNode));

应该是

  CpuNode *temp;
  temp= (CpuNode *)malloc(sizeof(CpuNode));

忘记临时前面的指针。

这是消除seg fault的代码。

  inline static void push(List *q,CpuNode *n)
  {
    CpuNode *temp;                       

    temp= (CpuNode *)malloc(sizeof(CpuNode));
    temp->cpuid=n->cpuid;
    temp->next=NULL;
    if (q->HeadCpuNode==NULL) 
        q->HeadCpuNode=q->TailCpuNode=temp;
    else 
    {
       q->TailCpuNode=temp;  //This line should come first.
       q->TailCpuNode->next=temp;
    }   
}

void Discover(List *Acqcores)
{
    CpuNode *temp;
    temp= malloc(sizeof(CpuNode));
    temp->cpuid=1;
    push(Acqcores,temp);
}