2017-03-31 6 views
0

Cでリンクリストを使用してスタックを実装しようとしていますが、新しいものをプッシュした後、スタック上に置く。私はこれが起こっていることを知っている、なぜなら、プログラムがまだスタックがヌルであると言っているからだ。何らかの理由で、私がプッシュで行う変更は、関数が終了したときには残りません。理由を理解できません。それはの一部だ、助けてくれてありがとう私はプッシュは正確にこれらのパラメータで行わなければならないことを言及するのを忘れてしまった:Cのリストは、初期化されたスタックにデータをプッシュすると変更されません。

typedef struct stack 
{ 
    int value; 
    struct stack * next; 
} * stack_T; 

stack_T 
new_stack() 
{ 
    return NULL; 
} 

int 
push_stack(stack_T s, int data) 
{ 
    stack_T new = malloc(sizeof(stack_T)); 
    new = s; 
    if (s == NULL) 
    { 
     s = malloc(sizeof(stack_T)); 
     if (s == NULL) 
      return 1; 
    } 
    s->value = data; 
    s->next = new; 
    return 0; 
} 

EDIT:

は、ここに私のスタック構造体、初期化のためのコード、およびプッシュです仕事、宿題。私はそれをする方法を探しているのではなく、むしろ私が間違っていることを探しています。私は参照渡しをエミュレートすることができます知っているが、私が言ったようにそれがなければならない。このスタイルで前

int push_stack(stack_T s, int data) 

私が作った構造体とちょうどパラメータとしてそれらを取る機能を有しており、変更はとどまるが、彼らは勝ちましたこの場合、私は理由が分かりません。

+2

を発生しているた行を決定するためにvalgrindを使用できることであるあなたは、一般的にstack_T' 'のようなポインタの型のエイリアスを作成するべきではありません。これは 'malloc(sizeof(stack_T))'が構造体ではなくポインタ***に十分なスペースを割り当てているからです。 –

+0

c *で参照による呼び出しをエミュレートすることについても検索して読んでください。 –

+1

また、スタックをmallocして、次の行の唯一の参照を上書きします....何を指しているのかを描き、コードを歩かなければいけません...複数の間違いがあります... – blackghost

答えて

0

ダブルポインタとしてsと表示されていないようです。リンクされたリストの前に押し込もうとしているようです。必要なのは、メモリに格納されているアドレス値を変更するために、スタックの先頭への参照のダブルポインタを渡すことです。この方法では、常にスタックの先頭を参照することになります。

int 
push_stack(stack_T **s, int data) 
{ 
    stack_T *new = malloc(sizeof(stack_T)); 
    if (new == NULL) 
     return (1); 
    if (s == NULL) 
    { 
     free(new); 
     return (1); 
    } 
    new->value = data; 
    new->next = *s; 
    *s = new; 
    return 0; 
} 

segfaultにつながる主な機能がどのように呼び出されているかを確認する必要があります。ただし、スタックの先頭を適切に参照していないようです。また、私はあなたが2つのノードのスペースをmallocしている理由をよく理解していません。 Mallocはあなたが指定したサイズで要求されているポインタを返します。あなたがここに書いたもの

stack_T new = malloc(sizeof(stack_T)); 
new = s; 
if (s == NULL) 
    { 
     s = malloc(sizeof(stack_T)); 
     if (s == NULL) 
      return 1; 
    } 

あなたがの変数を保存しようとしているので、あなたがそれを割り当てられたとして、ボイドポインタとsのAAタイプではなく、ポインタ型であるされてNULLと会ったことはありませんmallocが8バイトのポインタを返すときの12バイト。

また先端はあなたがgcc -gでコンパイルするとセグメンテーション違反が

+0

いいえ、あなたは 'stack_T'が既にポインタ型なので、' stack_T * 'は実際にはダブルポインタです。実際にtypedefの背後にそれを隠すOPの無礼。 –

+0

SはNULLとして初期化されるので、最初のチェックでNULLになる可能性があります.2番目のチェックの理由は、mallocが何らかの理由でNULLを返すメモリを見つけることができない(まれな)ケースです。また、Johnが言ったように、stack_Tはすでにポインタです。しかし、助けてくれてありがとう。 – forev3r

関連する問題