gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:56:23 24 4
gpt4 key购买 nike

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

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

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

最佳答案

如果要传递内存值,则需要使每个条目都有不同的内存值,而不是一遍又一遍地递增相同的地址并传递相同的地址。您需要使用malloc从堆中分配内存,将该内存设置为您想要的任何整数值(在本例中为1-9),然后将该指针插入堆栈。

类似这样的事情:

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

稍后,当您完成堆栈后,您将需要弹出每个指针并释放它。

关于c - 如何使用 void* 数组作为数据结构将元素插入堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11303380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com