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

标签 c generics stack abstraction abstract-data-type

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

相关文章:

c++ - 关于软件许可证

c# - 如何编写为模板化基指定类型参数的派生类

java - 泛型类共享静态成员吗​​?

c - 这不是多余的吗?

c - 了解 scanf 在这段代码中所做的事情

c++ - 后缀表示法计算器 (RPN) 问题 C++

arrays - 将 5 个二维数组沿对角线垂直堆叠以构建整个二维数组

java - 如果将一个项目插入堆栈但初始容量已满,会发生什么情况?

C - 使用 fwrite 在其他结构数组中创建一个结构数组的 bin 文件

数组的 Swift 5 动态类型