最近我一直用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
。
这个问题有解决办法吗?或者只是这不是推送数组中元素的最佳方法?
答案 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
并正常处理分配失败。