2016-07-27 2 views
2

ここに初めて投稿すると、どんな助力にも感謝します。 Stack_Initという名前の関数を使って "try"という名前のスタック内の値 "size"を変更しようとしています。関数内で "stack-> size"の値を出力すると、size(4)という正しい値が得られます。私は(コードの終わり)私の関数を実行した後 try->sizeを印刷した場合、それは私の読書のための0関数を介して構造体内のデータの値を変更するにはどうすればよいですか?

struct intnode { 
    int data; 
    struct intnode *next; 
}; typedef struct intnode node; 

struct stack { 
    node *top;  
    int size; 
}; typedef struct stack Stack; 

void Stack_Init(Stack *S, int size){ 
    Stack *stack = malloc(size*sizeof(node)); 
    stack->top = NULL; 
    stack->size = size;//for some reason, this doesn't change try->size 
} 
int main(){ 
    Stack *try; 
    int size = 4; 
    Stack_Init(try,size); 
    printf("%d %d ", try->size, try->top); 

感謝の価値を与えるだろう!

+0

'Stack * stack = malloc(size * sizeof(node));'。これはローカル変数です。 'main'では' try'とは関係ありません。なぜあなたはそれがどうだろうと思いますか?ほとんどの初心者は 'S = stack'をやっている間違いをします。 'S'は関数のローカルなので、これも間違っています。しかし、あなたはそれをしていないので、スタックが 'main'に戻ることをどのように期待しているのか分かりません。 – kaylum

+0

私はこれまでスタックの代わりに 'S'としてそれを持っていましたが、メインでも何も変わっていませんでした。それを今見ても意味がありません、どうすれば機能に挑戦するのですか? –

答えて

3

あなたは関数に渡すポインタを変更しようとしています。つまり、ポインターへのポインタという特別なレベルの間接指定が必要です。また、あなたの代わりに、ローカル変数の間接参照されたパラメータに割り当てる必要があります。

Stack_Init(&try,size); 
//  ^
//   | 
// Pass a pointer to a pointer 
+0

"関数に渡すポインタを変更しようとしています"。ニットピック。 OPでもそれはしていない。 – kaylum

+0

本当にありがとう、本当にありがとう! –

+0

機能の署名を変更する必要はありません。 'Stack ** S'はあなたが' Stack * 'のリストを持っていることを意味します。また、 'Stack * 'を' Stack **'にするために、パラメータ '&try'を使っています。それは物事を複雑にするだけです。 – kamoroso94

0

あなたStack_Init機能はそれにカップルの問題を抱えている:関数の呼び出しは次のようになりする必要が

void Stack_Init(Stack **S, int size){ 
    //    ^
    //     | 
    //  Extra asterisk here 
    *S = malloc(size*sizeof(node)); 
//^
// | 
// Dereference the pointer passed into the function 
    (*S)->top = NULL; 
    (*S)->size = size; 
} 

。関数に渡された引数の代わりにローカル変数を変更していて、メモリを誤って割り当てています。代わりにこれを試してください。

void Stack_Init(Stack **S,int size) { 
    Stack *stack = (Stack*)malloc(sizeof(Stack)); 
    stack->top = NULL; 
    stack->size = size; 
    *S = stack; 
} 
+0

これを私の注意を引くことに感謝します。あなたは大丈夫です。 – kamoroso94

+0

非常に真です。私はそれを反映するように関数を修正し、問題のコードにもっと似ていました。 – kamoroso94

関連する問題