【问题标题】:Change array size inside a struct更改结构内的数组大小
【发布时间】:2015-01-24 18:06:59
【问题描述】:

我正在尝试使用 C 中的结构和动态内存分配来模拟堆栈(将值推送和弹出到堆栈顶部),我有这个结构:

...
#define max 5

typedef struct stack  
{
    int stk[max];
    int top;
}STACK;
...

我成功模拟了堆栈,但是当它达到最大大小(堆栈已满)时,我想更改 max 的值,以便继续将值添加(推送)到堆栈顶部。换句话说,如果可能的话,我只想重新分配结构的stk 字段中的最大值。

欢迎提出任何建议。

【问题讨论】:

    标签: c struct stack realloc


    【解决方案1】:

    使用int stk[max]; 不是动态内存分配。

    您需要有指针int * stk; 并使用malloc 对其进行初始化。然后 realloc 当需要更多内存时。当不再需要堆栈时,使用free 释放它。

    【讨论】:

      【解决方案2】:

      正如@user694733 所指出的,您必须使用动态内存。另一个例子可以是:

      typedef struct stack  
      {
          int top;
          int max;
          int stk[];
      }STACK;
      
      STACK *init_stack(int m){
          STACK *st = (STACK *)malloc(sizeof(STACK)+m*sizeof(int));
          st->top = 0;
          st->max = m;
          return st;
      }
      
      STACK *resize_stack(STACK *st, int m){
          if (m<=st->max){
               return st; /* Take sure do not kill old values */
          }
          STACK *st = (STACK *)realloc(sizeof(STACK)+m*sizeof(int));
          st->max = m;
          return st;
      }
      

      现在您可以在您的程序中使用该功能,例如:

      void main(void){
          STACK *st = init_stack(5);
          .... do something bu you need more room....
          st = resize_stack(st,100);
          ..... Now is small again .....
          st = resize_stack(st,5);
      } 
      

      请注意每个realloc 调用都有一个线性成本,因此您不能使用它来仅添加恒定数量的元素:最好使用几何展开。看看http://en.wikipedia.org/wiki/Dynamic_array 作为动态数组的起点。

      【讨论】:

        【解决方案3】:

        试试这样:

        typedef struct stack
        {
          int *stk;
          int top;
        }
        
        signed int array_resize(stack *s, size_t size)
        {
          if(!s) return -1;
        
          s->stk = realloc(s->stk, size * sizeof(int));
        
          return 0;
        }
        

        这会为整数数组重新分配空间。我不知道还有什么方法可以完成这项工作。

        【讨论】:

          猜你喜欢
          • 2021-02-03
          • 1970-01-01
          • 2015-11-26
          • 2015-06-22
          • 2015-08-26
          • 2021-12-24
          • 2011-06-17
          • 1970-01-01
          相关资源
          最近更新 更多