2012-02-10 23 views
1

コードは次のとおりですが、何も問題はないようです。私のgccがalloc.hセグメンテーションフォールト、メモリが割り当てられていません

print(node *q) 
    39 { 
    40  node *p=q; 
    41    do 
    42  { 
    43   printf("%d",p->n); 
    44   if(p->ptr != NULL) 
    45   p=p->ptr; 
    46   else 

(GDB)頁 $ 1 =(ノード*)を0x0

とメモリが割り当てられているコードをされて見つけるdoesntの

if(p== NULL) 
    { 
      p=(node *)malloc(sizeof(node)); 
      if(p== NULL) 
        printf("The malloc failed\n"); 
      p->n=num; 
      p->ptr=NULL; 
    } 

私はこれを実行しますデバッガmallocが失敗したというメッセージはありません。

誰でも手助けできます。 hmjdの答えによって対処問題に加えて

add(node **q) 
{ 
    int num; 
    printf("Enter the number you want to add"); 
    scanf("%d", &num); 
    if(*q == NULL) 
    { 
     *q = malloc(sizeof(node)); /* no need to cast return value. */ 

     /* Corrected if logic to not access failed malloc. */ 
     if(*q == NULL) 
     { 
      printf("The malloc failed\n"); 
     } 
     else 
     { 
      *q->n=num; 
      *q->ptr=NULL; 
     } 
    } 
} 
+2

は '万が一引数(タイプの'ノード* ')とアロケータ関数に渡さp'ですか? – Mat

+0

あなたの投稿を編集して、そのループの残りの部分を表示してください。また、segvの発生場所も教えてください。また、Matが示唆するように、割り当て関数全体を表示します。 – Useless

+0

はいpはノード* pとして宣言されています。 – sraddhaj

答えて

0

、あなたが望むかもしれない: あなたは地元padd()機能に*qに割り当てる必要はありません

Sraddha

add(node **q) 
    { 
     node *p=*q; 
     int num; 
     printf("Enter the number you want to add"); 
     scanf("%d", &num); 
     if(p== NULL) 
     { 
      p=(node *)malloc(sizeof(node)); 
      if(p== NULL) 
        printf("The malloc failed\n"); 
      p->n=num; 
      p->ptr=NULL; 
     } 
    } 
+0

ありがとうLundinこれは良いアプローチです。 – sraddhaj

5

よろしく異なるプログラム設計を検討する。あなたは機能を3つの全く異なるもの、つまりユーザーとの相互作用、メモリの割り当て、実際のアルゴリズムとします。このプログラムの設計は、バグの原因となった実際の犯人でした。

代わりに、あなたはより多くのオブジェクト指向のアプローチを検討する必要があります:

int prompt_user (void) // this function interacts with the user ("GUI") 
{ 
    int num; 
    printf("Enter the number you want to add"); 
    scanf("%d", &num); 
    getchar(); // discard line feed character from stdin 

    return num; 
} 

void init_node (node* new_node, int num) 
{ 
    new_node->n = num; 
    new_node->ptr = NULL; 
} 


// this code is the caller: 
{ 
    node* q = NULL; 

    ... 

    int num = prompt_user(); 

    if(q == NULL) 
    { 
    q = malloc(sizeof(node)); 
    if(q == NULL) 
    { 
     // error handling 
    } 
    } 

    init_node(q, num); 

    ... 

    free(q); 
} 
+0

はい、今は分かります。ありがとうhmjd。私はこれを試してみる。 – sraddhaj

+0

この回答のmallocに関するコメントは重要です。[こちらを読む](http://stackoverflow.com/questions/1565496/specifically-whats-dangerous-about-casting-the-result-of-malloc) – Lundin

+0

@ sraddhaj、これで解決しましたか? – hmjd

関連する問題