我在做作业时遇到了一些麻烦我应该实现一个动态增长的堆栈,当它满的时候它的大小会翻倍,当它满了1/4的时候会减半因为我是一个完全的C初学者,而且不熟悉指针,所以我浏览了一些例子,这是我想出的代码。
它实际上是在gcc中编译的,没有任何警告,但是当我试图运行它时会产生“分段错误”我发现这可能与断球有关,但我没有看到任何错误,如果有人能为我指出,我会很高兴。
干杯

# ifndef STACK_H
# define STACK_H
# include "stdlib.h"

typedef struct stack {
  int *stack;
  int used;
  int size;
} stack;

stack* stck_construct() {
    stack *stck;
    stck->stack = (int *)malloc(10 * sizeof(int));
    stck->used = 0;
    stck->size = 10;
    return stck;
}

void   stck_destruct(stack *stck) {
    stck->stack = 0;
    stck->used = stck->size = 0;
    free(stck);
}

int    stck_push(stack *stck, int val) {
  if (stck->used == stck->size) {
    stck->size *= 2;
    stck->stack = (int *)realloc(stck->stack, stck->size * sizeof(int));
  }
  stck->stack[stck->used] = val;
  stck->used++;
  return 1;
}

int    stck_pop(stack *stck, int *val) {
  *val = stck->stack[stck->used];
  free(stck->stack);
  stck->used--;
  if (stck->used <= (stck->size)/4) {
    if (stck->size <=40) stck->size = 10;
    else stck->size /= 2;
    stck->stack = (int *)realloc(stck->stack, stck->size * sizeof(int));
  }

  return 1;
}

int main(){

    stack* test;

    test=stck_construct();

    int i; int out;
    for (i =1; i<=10; i++)
        stck_push(test, i);

    for (i =1; i<=10; i++)  {
        stck_pop(test,&out);
        printf("%i\n", out);
    }
    stck_destruct(test);
    return 0;
}

# endif

最佳答案

stack* stck_construct()中,您使用stck->而没有首先创建stck。实际上,它只是一个指针,不引用任何地方。这肯定会产生分割错误。你把astack*和一个实际的stack混淆了(或者你只是忘记了malloc整件事:)
注意:还有一些其他的虫子,我没有提到如果你感兴趣,可以看大卫和阿列克谢的评论。

关于c - 在C中动态增长Stack,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14462047/

10-10 01:00