【发布时间】:2012-04-08 12:36:00
【问题描述】:
我目前正在用 C 语言编写一个堆栈实现。我需要它使用尽可能少的内存并尽可能快,同时仍然采用我可以扔给它的每种数据类型,每个堆栈中有多种类型。我决定为此使用 void 指针,尽管我的 C 生锈了,但它的工作速度相对较快。然而,实际上使用它是相当难看的。
为了测试堆栈,我使用循环推送整数。实际上将 int 作为 void 指针传递是问题所在。
我的第一个想法是使用&:
for (int i = 0; i < 20; i++){
stack_push(s, &i); //s is the stack_t pointer
}
但是,如果仔细检查,这显然是行不通的,因为i 每一步都会破坏性地更新。堆栈中的每个元素都以20 结尾。
我后来转向了一个非常丑陋的解决方案:
for (int i = 0; i < 20; i++){
int* p = malloc(sizeof(void*));
*p = i;
stack_push(s, p);
}
这有效,但存在两个问题:
很丑
我不得不担心堆栈中每个元素的内存管理。 (出于某种原因,手动遍历堆栈并释放每个元素仍然会泄漏内存......)
有没有更好的方法来做到这一点,而不用联合浪费不必要的内存并且仍然很快?谢谢。
【问题讨论】:
-
当你从堆栈中弹出项目时,你怎么知道你刚刚取出了什么?您在每个堆栈中都提到了多种类型,但仅凭一个指针就无法判断它是什么类型的项目。
-
堆栈的用途是什么?粗略地说,堆栈释放内存的速度很快,因为您只需将堆栈指针向下移动即可。但是如果栈只包含指向堆的指针,仍然需要一个一个地释放,那么栈仍然是最好的解决方案吗?
-
我不确定你在这里问什么。您推送的指针通常不是指向简单整数的指针,而是指向某些类型对象的有效指针。调用者不是负责管理这些对象的内存吗?或者您是否正在考虑一个堆栈实现,它对指针负责并在堆栈被销毁时释放它们?
-
@Douglas 这是一种基于堆栈的语言的实现,所以我在数据结构类型上没有太多选择——它至少需要是可推送的、可查看的和可弹出的
-
@NiklasB。是的,如果需要的话,我想要一些我可以直接将对象放入其中的东西。
标签: c syntax void void-pointers