2017-04-10 6 views
-4

私はリストと簡単な宿題をやろうとしていると私は機能コードにしたい:頭が向いている場合if文でヌルポインタを使用できないのはなぜですか?

  1. は、リストの先頭と整数
  2. チェックにダブルポインタを受信しますNULLへのヘッドポイントもし何かまたはNULL
  3. に、そして私の新しいノードを含む新しいメモリ位置に再割り当て[その他]
  4. nullでない場合は、単にリスト
  5. の下に新しいノードを追加

しかし、私のコードがヘッドリストがNULLかどうかをチェックするときに "read access memory violation"を受け取る。 これは私のコードです:それは、これを行うためになるまで

void InserList(t_node** lis, int x) { 
    t_node* temp; 
    temp = malloc(sizeof(t_node)); 
    temp->num = x; 
    if (*lis == NULL) { 
     temp->next = NULL; 
     *lis = temp; 
    } 
    else { 
     temp = *lis; 
     while (temp->next != NULL) { 
      temp = temp->next; 
     } 
     temp->next = malloc(sizeof(t_node)); 
     temp->next->num = x; 
     temp->next->next = NULL; 
    } 
} 

私のコードは問題なく動作します:

if (*lis == NULL) { 
     ... 
} 

私にエラーを与える "LISはをnullptrました"。 私の考えは間違っていますか?この機能をどのように修正する必要がありますか?

はあなたに

EDITありがとう:これは、あなたが警告してコンパイルする必要がある理由です

int main(void) { 
    int elements; 
    int count; 
    int tempnum; 
    t_node *head, *second_head; 
    head = second_head = NULL; 
    t_node **ref_head, **ref_second_head; 
    ref_head = &head; 
    ref_second_head = &second_head; 
    scanf("%d", &elements); 
    for (count = 0; count != elements; count++) { 
     scanf("%d", &tempnum); 
     InserList(head, tempnum); 
     if (IsPrimo(tempnum) == false) { 
      InserList(second_head, tempnum); 
     } 
    } 
    PrintList(second_head); 
} 
+1

そして、あなたはどのように 'InserList'を呼び出しましたか?あなたがそれを管理する方法に依存します) – StoryTeller

+1

'if(lis == NULL) – BlackBear

+1

'lis'自体がポインタです、どうして最初にチェックしてみてください。なぜなら、' lis'はどこから来たのですか? –

答えて

2

主な機能です。ここではあなたが何をすべきかです:

InserList(head, tempnum); 

あなたはt_node **が期待されているt_node *を渡します。それらは互換性のないポインタ型です。したがって、プログラムには未定義の動作があります。

InserList(&head, tempnum); 

次に、あなたのコンパイラハイレベルの警告フラグを与え、それが自由に警告されるまで、あなたのコードを修正:がすべきことを

修正

+0

ありがとう、私は "ref_head "と" ref_second_head "はこれだけですが、私はそれらを使っていませんでした。どんな馬鹿なのですか? もう一度ありがとう – RaiN

関連する問題