2011-04-20 11 views
1

私はポインタとCの構造体に問題があります(私は知っています、私はかなり基本的です)!私は私の手続きパラダイムを練習していました。デバッガを使用するのは初めてのことです。なぜなら私はそれが以前の私の人生ではそれほど必要ではなかったからです。<私はあなたを助けてくれて感謝しています。Cのポインタの問題

私は、リストを作るために、以下の構造を定義した:

int main(int argc, char** argv) { 
    node_t * list = NULL; 
    addNodo(list, 1); 
    printf("x: %d", list->info); 
    return (EXIT_SUCCESS); 
} 

:これをやって、その後、

void addNodo(node_t * list, int x){ 
    node_t * pointer; 
    node_t * temp; 

    temp = (node_t *)malloc(sizeof(node_t)); 
    temp->info = x; 
    temp->next = NULL; 
    temp->prev = NULL; 

    pointer = list; 

    if(pointer == NULL){ //it's empty so start it 
     list = temp; 
     return; 
    } 

    if (pointer->info <= x) { //I like my lists tidy so... 
     while((pointer->next != NULL) && (pointer->info <= x)){ 
      pointer = pointer->next; 
     } 

     if(pointer->next == NULL){ 
      pointer->next = temp; 
      temp->prev = pointer; 
      return; 
     } 

     pointer->next->prev = temp; 
     temp->next = pointer->next; 
     temp->prev = pointer; 
     pointer->next = temp; 
     return; 
    } 
} 

そして:

typedef struct node { 
    int info; 
    struct node *next; 
    struct node *prev; 
} node_t; 

そして、この関数はそれを埋めるためにそれは私にセグメンテーションエラーを投げている!私がそれをデバッグすると、++++の行を渡すまで、すべてが楽しくゲームが行われます。リストのアドレスは0x0に戻り、動作させることはできません。私はどこかにエラーがあることを知っていますが、私のポインタの知識には、それは完璧です。私のエラーを検出して、私に指針を教えてください。

+0

nodo_tとは – TimFoolery

答えて

4

addNode()を呼び出すと、ポインタを値に渡しています。したがって、関数の本体でそれを変更すると、変更は失われ、関数外には伝播しません。

のように宣言し、次に関数内で*pointerを使用する必要があります。

そして、あなたがメインでITYを呼び出すとき、あなたは古典的な間違い作っている&list

+0

ありがとう、それは私の前で正しかった!! – fixmycode

+0

あなたは大歓迎です! – QuantumMechanic

0

に渡す:

void addNodo(node_t * list, int x) 
... 

list = temp; 
return; 

listは()main()の呼び出し側で変更されていない

listメモリの値を変更することはできますが、listの値を変更することはできず、呼び出し側にその値を表示させることはできません。

そのためには、あなたは、関数にポインタへのポインタを渡す必要があるでしょう:

*list = temp; 
1

void addNodo(node_t **list int x) 

これはあなたがで何をリストポイント行うことによって変更することができます

addNodo関数内でリストを変更できないという問題があります。 Cのパラメータは値によって送られるので、あなたが "addNodo"の内部で行っている変更はローカルである。

addNodo関数を変更する必要がありますので、実際にはリストの方向を受け取ります。

void addNode(node_t **list, int x){ 
    ... 
    if(*pointer==NULL){ 
    *list = temp; 
} 
} 

次に、あなたの主にあなたが使用する必要があります。

addNode(&list, 1); 
1

をさて、あなたは値によって、リストのアドレスを渡すの間違いを犯しています。したがって、関数のすべての引数はコピーされ、addNodo()はコピーされた変数に対して機能します。したがって、元のリストは変更されません。

何の呼び出し中にあなたがやるべきことはこれです:

void addNodo(node_t ** list, int x) 
/* This will enable you to get a copy of the address of the list variable. 
    Please note that this is also pass by value, C does not support pass by 
    reference */ 

そして、この変更を行う:機能で

addNodo(&list, 1); 

は、これらの変更が作る

pointer = *list; 
    /* this will make the pointer point to the beginning of list as now 
     list is a pointer to pointer type */ 

はそれが役に立てば幸い君は。

私はCで引数を渡し、内部的に何が起こるのかよく知るために、標準Cの本(私はK & Rをお勧めします)をご覧ください。