2017-12-06 4 views
-1

私はCのリンクリストを使って作業していますが、ポインタの使用が非常にうまくいかないと思います。関数の後にポインタがヌルです

私はリンクされたリストのための構造を持っています。最初の要素をNULLに初期化します。このポインタを関数に送り、リストの新しい要素を(mallocで)作成します。しかし、関数の呼び出し後、私の要素はまだNULLです。わかりません。それは確かに愚かなエラーですが、私はいくつかの助けが必要...変更を行うために私に

+1

タイプ「Goto」を呼び出すことは最適ではありません。 –

+0

あなたの問題は、 'c'のすべてが値渡しであるという事実に根ざしています。 'gotoList'のローカルコピーは、その関数を呼び出すときに' addLabel'で作成され、そのスコープはその関数内にのみ存在します。 'gotoList'への変更を' addLabel'の外で持続させたい場合は、 'gotoList'を返すか、そのポインタ(' Goto ** '型)を渡し、そのポインタを関数内で逆参照する必要があります。 – yano

答えて

1

まあを助けてくれてありがとうあなたが発信者からの変数のアドレスを渡す必要がいずれか

typedef struct Goto Goto; 
struct Goto 
{ 
    int index; 
    Goto *next; 
}; 


//my code 
Goto* gotoList = NULL; 
addLabel(gotoList, index); 
// Here : gotoList is NULL 


void addLabel(Goto* gotoList, int value) { 
    if (gotoList == NULL) { 
     Goto* gotoLabel = malloc(sizeof(*gotoList)); 
     gotoLabel->index = value; 
     gotoLabel->next = NULL; 
     gotoList = gotoLabel; 
    } 
    else { 
     Goto* gotoLabel = gotoList; 
     Goto* newLabel = malloc(sizeof(*newLabel)); 
     newLabel->next = NULL; 
     newLabel->index = value; 
     while (gotoLabel->next != NULL) { 
      gotoLabel = gotoLabel->next; 
     } 
     gotoLabel->next = newLabel; 
    } 
// Here : gotoList is not NULL 

}

関数または呼び出し先関数から割り当てられたメモリのアドレスを返し、それぞれの変数に割り当てます。

ここではどちらもしていないので、変更を保持することはできません。

変数のアドレスを渡すことで、次のようにすることができます。(もう1つは、完全に理解すれば簡単に実行できます)。

void addLabel(Goto** gotoList, int value) { 
    if (*gotoList == NULL) { 
     Goto* gotoLabel = malloc(sizeof(*gotoLabel)); 
     gotoLabel->index = value; 
     gotoLabel->next = NULL; 
     *gotoList = gotoLabel; 
    } 
    else { 
     Goto* gotoLabel = *gotoList; 
     Goto* newLabel = malloc(sizeof(*newLabel)); 
     newLabel->next = NULL; 
     newLabel->index = value; 
     while (gotoLabel->next != NULL) { 
      gotoLabel = gotoLabel->next; 
     } 
     gotoLabel->next = newLabel; 
    } 
} 

ここでは、変数のアドレスが単純に渡されます。あなたは、変数の名前を選択するには、あなたが悪いの選択肢を持って、この

addLabel(&listhead,val); 

一つのことのように関数を呼び出します。 Gotoは変数名の最後の選択です。 Cgotoはキーワードであり、そのバリエーションに変数を付けることは、誤解を招くだけでなく、意味も誤っていることにつながります。

+0

ありがとう!実際、ゴルチリストはポインタであったため、値を変更できると思っていましたが、ポインタへのポインタが必要です。そして、私はGotoがCのキーワードであることを知らなかった。私は変更するだろう – iAmoric

+0

@iAmoric .:ポインタは値を変更できるわけではありません。それはただのアドレスなので、そのアドレスの内容に何も変更することはできません。 – coderredoc

+0

はい、それは私の肉です、ポインタを使用してアドレスの内容を変更します。とにかく、私を助けてくれてありがとう。質問が解決されました – iAmoric