0

最近、void ポインターの配列を使用して汎用スタックのコードを C で書いています。いくつかのテストを行った後、この最後のテストまで、すべてがうまくいっているように見えました:

while(i < 9) {
    push_pila(mi_pila,(int*)&i);
    i++;
}

ご覧のとおりi、関数に引数として anを渡していpush_pilaます。push_pilaこれは、スタック内の関数のコードです。

typedef struct {
        void **vec;
        int tope;
        int16_t max_elementos;
    }PILA;

int push_pila(PILA *mi_pila,void *val) {
    if(pila_llena(mi_pila)) {
        return -1;
    }
    else {
        mi_pila->tope = mi_pila->tope + 1;
        mi_pila->vec[mi_pila->tope] = val;
        return 0;
    }
}

void*私のスタックはのアドレスの値を含む の配列であるため、問題はここにありますval。の値を渡すときはi、そのアドレスを渡しています。この場合の問題は、スタック内のすべての値に同じアドレスが含まれるため、スタック内のすべての値が同じになるため、pop 関数を使用してスタックをポップすると、最後に同じ値が返されることです。の値i、私の場合9

この問題の解決策はありますか? それとも、これが配列内の要素をプッシュする最良の方法ではないということですか?

4

2 に答える 2

1

メモリ値を渡す場合は、同じアドレスを何度もインクリメントして同じアドレスを渡すのではなく、各エントリに個別のメモリ値を持たせる必要があります。を使用してヒープからメモリを割り当てmalloc、そのメモリを任意の整数値 (この場合は 1 ~ 9) に設定してから、そのポインタをスタックにプッシュする必要があります。

このようなもの:

while(i < 9) {
    int* int_ptr = (int*) malloc(sizeof(int));
    *int_ptr = i;
    push_pila(mi_pila, int_ptr);
    i++;
}

後で、スタックの操作が完了したら、各ポインターとそれをポップオフする必要がありますfree

于 2012-07-03T01:39:56.370 に答える
0

各整数を保持するために新しいストレージを割り当てる必要があります。

while(i < 9) {
    int *i_boxed = safe_malloc(sizeof(int));
    *i_boxed = i; 
    push_pila(mi_pila, i_boxed); 
    i++; 
} 

割り当ての失敗を適切safe_mallocに呼び出して処理するだけであることに注意してください。malloc

于 2012-07-03T01:41:07.717 に答える