2016-05-07 7 views
-2

私は "自動車フリート"管理ツールを実装しています。
リンクされたリストのcの頭のアドレスを失う

typedef struct Car{ 
    char ID[9]; 
    struct Car* next; 
} Car; 

私の艦隊は、単に車のリンクリストになります:スタートのために、私は「車」構造体を宣言しました。空の頭から始め、add_car関数を使ってリンクを追加します。

void add_car (struct Car* cars_fleet){ 
    struct Car* car = malloc (sizeof (car)); 
    scanf("%s",car->ID); 
    car->next = NULL; 

if (cars_fleet == NULL){ 
    printf ("creating new list\n"); 
    cars_fleet = car;  
} 

else { 
    printf ("appending\n"); 
    Car* tmp = cars_fleet; 
    while (! (tmp->next == NULL)) 
     tmp = tmp->next; 
    tmp->next = car; 
} 
} 

そして、これは私のメインプログラムである:

int main(){ 
Car* cars_fleet = NULL; 
add_car(cars_fleet); 
} 

彼らは最初のものであるかのように今、何らかの理由で、私のプログラムは、すべてのリンクを扱います。おそらく "cars_fleet = car"という、間違ったメモリ割り当てが原因で起こっていると思います。ヒント、ヒント、または解決策はありますか?ありがとう。
ありがとう。あなたはadd_car内のローカル変数に割り当てる

+0

書式設定/インデント:( –

+0

'add _car(cars_fleet); 'は値渡しのため、cars_fleetを変更することはできません。 –

+0

ここで正しい構文は何でしょうか?フリートがポインタであり、add_carsがカーへのポインタを受け取った場合、フリートのアドレスを変更できないのはなぜですか?おそらく私は最初のIF句の中に新しい車をmallocする必要がありますか? –

答えて

0

ポインタを値渡ししています。そのため、関数void add_car(struct Car * cars_fleet)の変更は関数の外部では何の効果もありません。関数の内部で、

void add_car (struct Car** cars_fleet) 

が次に使用:このよう

void add_car (struct Car* cars_fleet) 

:あなたは、関数のプロトタイプを変更する必要があり、

*cars_fleet = car 

ながらメインに、呼び出し:

add_car(&cars_fleet); 
+0

はい。なぜこの構文が機能するのか理解できますか? cars_fleetはポインタなので、なぜそのアドレスを送信するのが重要なのですか?プロトタイプで2 "*"を使用する必要があるのはなぜですか? –

+0

あなたの最初のプロトタイプでは、cars_fleetポインターはmainで定義したポインターのコピーでしたので、コピーでコピーを修正していました。私が提出した新しいプロトタイプでは、mainに定義されているポインタのアドレスが関数に渡され、* cars_fleet = carを使用してこのポインタを変更します。 – shrike

+0

'fonction' - >' function'、そして値渡しやC言語での参照渡しというコンセプトはありませんが、すべて値渡しになります; –

0

は、変更へ:

Car *add_car(void){/* Car *x = malloc(...); ... return x */}; 

そしてmain中:私は私がいない場合cars_fleetのリンクを反復処理することが出来るのですか

Car* cars_fleet = NULL; 
cars_fleet = add_car(); 

add_carに渡しますか?私の住所は返されていますか? の住所は車が追加された新しいcars_fleetですか?あなたの質問あなたはNULLを渡しているので、リンク、デバイドthroug反復新鮮なノードと、リスト内のこの新しいCarを挿入する別のものを取得する関数を使用する機会がないで

(尾を渡します)。

+0

add_carに渡さないと、cars_fleetのリンクを繰り返し処理する方法を教えてください。私の住所は返されていますか?車を追加した新しいcars_fleetの住所? –

+0

お返事ありがとうございます。しかし、それは私の問題を解決しません。私はそれが空のリストにリンクを追加することが可能であることを知って、私はちょうどいくつかのポインタの基本が欠けていた。上記のanserはそれを行います。とにかく、ありがとう。 –

+0

あなたは 'malloc'が失敗することに気付きました。分割すると' x = add_car()のようなコードを使用してappend_car(tail、x)else raise error'を実行することができます。 –

関連する問題