2017-01-02 14 views
0

リンクリストとポインタで作業しています。ここには、プッシュ機能を含む簡単なコードがあります。要素をプッシュし、最初のメンバを印刷しようとすると、実行時に実行されたコードがクラッシュします。しかし、同じポインタをprint_list関数に渡して、printf関数をprint_listの中に適用すると、正常に動作します。しかし、それをmain関数で直接使用し、printf関数を適用するとクラッシュします。実行時にリンクされたリストを印刷するCプログラミングエラー、実行されたコードがクラッシュする

#include<stdio.h> 
#include<stdlib.h> 


typedef struct list{ 
int order; 
struct list *next; 

}list; 

void push(struct list **arg,int i); 

int main() 
{ 
struct list **ptr=NULL; 

for(int i=0;i<10;++i){ 
    push(&ptr,i); 
} 
    print_list(&ptr); // Here works fine 
    printf("%d\n", (*ptr)->order); //Here run time error 
return 0; 
} 


void push(struct list **arg,int i){ 

    struct list *temp; 
    temp= malloc(sizeof(list)); 

temp->order=i; 

temp->next=*arg; 

*arg=temp; 

} 


void print_list(list ** head) { 


while ((*head) != NULL) { 
    printf("%d\n", (*head)->order); //Here works fine too ! 
    *head = (*head)->next; 
} 
} 
+2

'list'は' ** 'ですが、'& 'でそれを渡すので、"受信者 "は実際に' *** 'を得ています - 3つ星のプログラマーは良いことではありません;-) – John3136

答えて

1

このコードにはいくつかのポインタ管理エラーがあります。

void print_list(list ** head) { 
    while ((*head) != NULL) { 
    printf("%d\n", (*head)->order); 
    *head = (*head)->next; // print_list is clearly a readonly function, you don't want to modify head of the list 
    } 
} 

代わりに使用イテレータ:

void print_list(list *head) { // Passing a copy of head pointer here, so real head can't be changed. 
    struct list *iter = head; 
    while (iter != NULL) { 
    printf("%d\n", iter->order); 
    iter = iter->next; 
    } 
} 

struct list **ptr=NULL; - ここでは、リストの先頭へのポインタを宣言するというあなたのしたいが、あなたはこのポインタへのポインタを宣言しています。

変更し、それに:struct list *ptr = NULL;

そして、これはあなたがprint_listためにそれを渡すために先頭のアドレスを取得するか必要はありません。変更後:

print_list(&ptr) - >print_list(ptr)

または間接参照をそれprintf関数で:

printf("%d\n", (*ptr)->order) - >printf("%d\n", ptr->order)

関連する問題