2017-04-10 83 views
-3

dubugging为什么这个代码给分段错误

计划接收信号SIGSEGV,分割故障时,这是错误。 [切换到 线程0x7ffff6ff5700(LWP 17504)] 0x0000000040124c在推送 (q = 0x7ffff6ff4ec0,n = ...)在discover.h:27 27
q-> TailCpuNode-> next = temp;

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); 
} 
+0

仅根据那条消息,我会说'q'或'q-> TailCpuNode'不包含确定地址。有时间启动调试器并开始向后走动调用堆栈。 – WhozCraig

+1

你能给我们足够的代码来复制这个问题吗? –

+1

从这里开始:https://stackoverflow.com/help/how-to-ask。然后使用您的调试器来缩小问题范围。然后问一个具体的问题,如果你不明白你的调试工作的结果。 –

回答

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

+0

其结构初始化后的工作,但我不明白,意思是我曾经使用未初始化的结构,但我从来没有得到这 –

+0

看到这个[http://ideone.com/MgHycX]我还没有初始化结构,但它仍然工作 –

+0

@jayasimhasai - 你的链接不起作用,所以我看不到你的代码。注意:在函数内声明的未初始化的结构是不好的(它可能工作,可能会失败)。全局结构(即在函数之外声明)会自动初始化为零。 – 4386427

0

没有与这些代码行的一个问题:

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

它应该是

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

忘记了温度前的指针。

这是消除seg故障的代码。

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); 
} 
+0

对不起,我打错了。我已经改变了,我仍然在分段错误 –

+0

投射'malloc()'的返回值是一个不合时宜的错误:void指针将被自动提升,并且转换可以屏蔽错误。除非您使用的是C89之前的编译器,否则既不必要也不推荐。 – Emmet

+0

对不起,但你错了。问题是:'q-> HeadCpuNode'访问一个未初始化的成员 – 4386427

相关问题