c указатель в качестве входных данных - PullRequest
0 голосов
/ 21 декабря 2009

когда я пытаюсь поместить элементы в стек, я получаю ошибку сегментации, но если я открываю адрес для стека (я пометил их как "!!!") и это символы, он принимает его. Но на этот раз при каждом нажатии он создает новый адрес и не увеличивает максимальное значение.

typedef struct
{
  struct table **symbols; // array of the stack
  int top; //index of the top element
  int size; //maximum size of the stack
}stack;

void push(stack *stck,struct table *element)
{  
    if(stck->top == stck->size)
    {
      printf("stack is full");
      return;
    }

    stck = malloc(sizeof(stack));                                          !!!
    stck->symbols = (struct table **)malloc(50 * sizeof(struct table*));   !!!

    printf("top : %d\n",stck->top);
    stck->top = stck->top++;
    printf("%d"&stck->top);
    stck->symbols[stck->top] = element;
    printf("top : %d\n",stck->top);
}

Ответы [ 4 ]

2 голосов
/ 21 декабря 2009

Вы должны создать свой стек, прежде чем вы сможете что-то добавить на него. Например. создайте функцию stack_new, которая будет выделять память для вашего стека и инициализировать ее члены:

stack * stack_new (size_t size)
{
    stack * stck = malloc(sizeof(stack));
    stck->top = -1;
    stck->size = size
    stck->symbols = (struct table **)malloc(size * sizeof(struct table*));
    return stck;
}

Теперь, когда вы правильно сконструировали свой стек с помощью указанной выше функции, вы можете передать его функции push.

1 голос
/ 21 декабря 2009

Прежде чем вы когда-либо позвоните push, вы захотите выделить малое пространство для стека.

С !!! строк, вы выделяете новую память с каждым нажатием, что неправильно.

без !!! строк, вы никогда не выделяете память

1 голос
/ 21 декабря 2009

Вы передаете один стек в переменную с именем stck, но затем выделяете новую структуру и присваиваете тот же указатель. Таким образом, стек, который вы передаете, никогда не изменяется. Я не думаю, что вам нужен первый вызов malloc.

0 голосов
/ 21 декабря 2009

Если вы передаете один стек указателей * stck, а затем malloc внутри функции, он не будет отражаться после выхода из функции.

Кроме того, зачем вам нужно выделять память для таблицы на 50 указателей каждый раз, когда вы хотите нажать?

Сделайте это, как показано ниже:

struct table
{
   //members go here
};

typedef struct
{
  struct table **symbols;
  int top;
  int size;
}stack;


struct table *get_elem(void)
{
   //logic for getting elements go here
}

void stack_push(stack *stck, struct table *element)
{

  if(stck->top==stck->size)
  {
    printf("Stack Full\n");
    return;
  }

  stck->top++;
  stck->symbols[stck->top] = element;
  return;
}

void stack_func()
{

 struct table *elem = NULL;
 stack *stck = (stack *)malloc(sizeof(stack));
 if(NULL==stck)
 {
   return;
 }

 stck->top = -1;
 stck->symbols = (struct table **)malloc(50 * sizeof(struct table *));

 if(NULL == stck->symbols)
 {
   free(stck);
   return;
 }

  stck->size = 49;

  elem = get_elem();
  //do check here for correctness of elem returned from get_elem

  stack_push(stck, elem);

  return;
}

Надеюсь, это поможет! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...