#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, не будет увеличено)