2017-04-10 102 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

相關問題