Запутался в операторе приращения в C

#c #syntax #stack

Вопрос:

Я написал программу на C для создания базового стека с использованием массива. Это работает, как и ожидалось, но есть кое-что, что меня очень смущает. В первой строке метода push я увеличиваю значение *top_ptr, которое является указателем на переменную top, используя синтаксис *top_ptr = *top_ptr 1 . Когда я пытаюсь заменить эту строку на *top_ptr , которая, на мой взгляд, более лаконична и означает то же самое, я получаю предупреждение, в котором говорится, что переменная Wunused и ошибка сегментации при ее запуске. Предупреждающее сообщение с моего терминала, слово в слово, таково

 warning: expression result unused [-Wunused-value]
*top_ptr  ;
^~~~~~~~~~
 

и мое точное сообщение об ошибке с терминала::

 zsh: segmentation fault  ./stacks/arrayi
 

Когда я запускаю программу с текущей программой, мой результат-это то, что я ожидаю: 1 2 3 %

Мой код приведен ниже. Опять же, строка, которую я путаю, — это первая строка метода push, которая является строкой 17. Если вы ответите на этот вопрос, то спасибо вам за ваше время и внимание.

 #include <stdio.h>
#define MAX_SIZE 101

void push(int *, int *, int);
void print(int *, int *);
int main() {
  int top = -1;
  int *top_ptr = amp;top;
  int arr[MAX_SIZE];
  push(arr, top_ptr, 1);
  push(arr, top_ptr, 2);
  push(arr, top_ptr, 3);
  print(arr, top_ptr);
}

void push(int *array, int *top_ptr, int x) {
  *top_ptr = *top_ptr   1;
  array[*top_ptr] = x;
}

void print(int *array, int *top_ptr) {
  for (int i = 0; i <= *top_ptr; i  ) {
    printf("%d ", array[i]);
  }
}
 

Комментарии:

1. Вы также могли бы сделать: *top_ptr = 1;

Ответ №1:

*top_ptr есть *(top_ptr ) , что неправильно , потому что это меняется top_ptr , а это не то, что вы хотите делать.

Ты хочешь (*top_ptr) .

Компилятор предупреждает вас, что результат выражения не используется , потому что после (top_ptr ) * этого извлекается значение, на которое (top_ptr ) указывает, но с этим значением ничего не делается. Это подозрительно, поэтому компилятор предупреждает вас, что вы сказали ему получить значение, но ничего с ним не делать.

В отличие от, с (*top_ptr) , это не предупреждает вас, потому что изменяет то, на что (*top_ptr) указывает, поэтому выражение заканчивается полезным действием.

Комментарии:

1. Это было лаконично и полезно. Сработало как заклинание. Теперь я знаю, что нужно искать его в будущем. Спасибо вам не только за ответ, но и за объяснение, Эрик (:

Ответ №2:

тебе следует заняться

 (*top_ptr)  ;
 

эта скобка важна. если вы не даете скобку, то в основном она будет выполнена так

 *(top_ptr  );
 

т. е. сначала указатель top_ptr будет увеличен, а затем он будет отложен. вот почему это дает вам ошибку в сегментации.
(и значение, указанное top_ptr, не будет увеличено)