как избежать изменения значения при вызове стека pu sh по адресу - PullRequest
0 голосов
/ 02 августа 2020

, так что у меня есть этот код, а реализация stack_pu sh принимает адрес, поэтому всякий раз, когда я изменяю значение cnt, все остальное тоже меняется, как мне предотвратить это? я хочу, чтобы это было x = 5, затем x = 2, я не могу изменить свою функцию stack_pu sh, так как это непрозрачная структура

int main(void){
  struct stack *a = stack_create(10*4);
  int cnt = 10;
  int i=cnt;
  while (cnt != 1){
    cnt = i/2;
    stack_push(a,&cnt);
    i = cnt;

  }
  int *x = stack_pop(a);
  x = stack_pop(a);
  stack_destroy(a);
}

1 Ответ

1 голос
/ 02 августа 2020

Учитывая, что stack_create манипулирует, это подразумевает следующее:

  • При помещении данных в стек, данные должны быть скопированы в malloc блок
  • При извлечении данные из стека, данные должны быть освобождены, когда они больше не используются

Скорее всего, у stack_ * есть функция для проверки, когда стек пуст. Рассмотрим следующий код для pu sh нескольких значений в стеке и извлечения их, следуя указанным выше пунктам.

Рассмотрим следующее

int main(void){
  struct stack *a = stack_create(10*4);
  int cnt = 10;
  int i=cnt;
  while (cnt != 1){
    cnt = i/2;
    //// COPY data to newly allocated block
    int *data = calloc(sizeof(*data)) ;
    *data = cnt ;
    stack_push(a,data);
    i = cnt;
  }

  //// Retrieve all items
  while ( !stackIsEmpty(a) ) {
     int *x = stack_pop(a);
     printf ("%d\n", *x) ;
     //// Free the copied data
     free(x) ;
  } ;
  stack_destroy(a);
}

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