В последнее время я пишу код на C для универсального стека, используя массив указателей void. После выполнения некоторых тестов все было в порядке, до последнего теста:
while(i < 9) {
push_pila(mi_pila,(int*)&i);
i++;
}
Как видите, я передаю i
в качестве аргумента функции 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
.
Есть ли решение этой проблемы? Или просто это не лучший способ вставлять элементы в массив?