如何使用void *数组作为数据结构将元素推入堆栈?

时间:2012-07-03 01:33:38

标签: c generics stack abstraction abstract-data-type

最近我一直用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

这个问题有解决办法吗?或者只是这不是推送数组中元素的最佳方法?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您必须分配新存储空间来容纳每个整数:

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

注意safe_malloc只需调用malloc并正常处理分配失败。