0

最近,我一直在使用 void 指针数组在 C 中为通用堆栈编写代码。在做了一些测试之后,一切似乎都很好,直到最后一次测试:

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

如您所见,我将 ani作为参数传递给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 回答