2017-04-10 16 views
-3

を与えているこれはdubuggingは、なぜ、このコードは、セグメンテーション違反に

プログラムはシグナルSIGSEGV、セグメンテーションフォールトを受信したエラーです。 [ スレッド0x7ffff6ff5700(LWP 17504)への切り替え] (q = 0x7ffff6ff4ec0、n = ...)discover.h:27 27
q-> TailCpuNode-> next = temp;プッシュの0x000000000040124cへの切り替え。

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

関連する問題