代码之家  ›  专栏  ›  技术社区  ›  Gary Willoughby

在C中实现动态调整堆栈大小的最佳方法是什么?

  •  2
  • Gary Willoughby  · 技术社区  · 15 年前

    最好的

    例如,我想为一个堆栈分配一定数量的内存,但当该堆栈满时,分配的内存会加倍以容纳新数据,等等。

    我使用一个简单的void指针数组立即实现了一个堆栈,这样我可以存储所有类型的指针,因此它是可重用的。当我尝试使用malloc()/realloc()实现此功能时,我在进行指针数学计算时遇到了错误,因为无效指针没有指定大小。

    问题是什么 最好的 对的 在C中实现动态调整堆栈大小的方法?

    编辑:

    我曾经尝试过类似这样的代码(错误检查被删除),但现在我明白了,我不能像这样与void指针交互。所以我只是在想如何合法地做这样的事情。这对我来说是一个很大的学习练习,因为我从来没有真正接触过C。

    #include <stdio.h>
    #include <stdlib.h>
    
    #include "stack.h"
    
    static int index = 0;
    
    void* CreateStack(void)
    {
        void *stack = malloc(INITIAL_STACK_SIZE);
        return stack;
    }
    
    void* Pop(void *stack)
    {
        return stack + index--;
    }
    
    void Push(void *stack, void *value)
    {
        *(stack + index) = value;
    }
    
    void FreeStack(void *stack)
    {
        free(stack);
    }
    
    5 回复  |  直到 15 年前
        1
  •  1
  •   Thomas Matthews    15 年前

    一种方法是对堆栈使用数组。跟踪阵列容量。如果数组已满,请分配一个新数组,将旧元素复制到新数组,然后删除旧数组。

        2
  •  4
  •   Anon.    15 年前

    我认为问题在于你打电话时使用了错误的尺码。您不需要指针对象的大小—您需要指针本身的大小。

        3
  •  3
  •   pm100    15 年前

    malloc(n * sizeof(void)) 
    

    直接或间接地,你需要

    malloc(n * sizeof(void*))
    

        4
  •  1
  •   Community CDub    7 年前

    我之前已经回答过这个问题,作为前面问题的一个子集:

    https://stackoverflow.com/questions/2006726/which-would-you-prefer-to-have-to-maintain/2007647#2007647

    您必须稍微调整一些内容—将char*替换为void*,将“addString”重命名为“push”,并编写一个“pop”函数。哦,对malloc和realloc的调用添加了错误检查,这在回答中被省略了,因为它在提问者的代码中被省略了。

    正如尼尔所说,尽管“最佳”是非常主观的。不断增长的数组只是实现堆栈的一种方法。根据使用模式以及您对代码复杂性、速度和内存使用的要求,您可能需要一个链表,或者您可能需要类似于 std::deque C++中的类。