я не могу понять, почему на моем экране нет вывода для этой простой реализации стека с использованием массива на языке си

#c

Вопрос:

 #include<stdio.h>
#include<stdlib.h>
struct stack{
    int size;
    int* ptr;
    int top;
};
int isfull(struct stack* a){
    if (a->top==a->size)
    {
        return 1;
    }
    return 0;
}
int isempty(struct stack* a){
     if (a->top == -1)
    {
        return 1;
    }
    else{
        return 0;
        }
}

int main()
{
    struct stack* A;
    A->size = 10;
    A->top = -1;
    A->ptr = (int *)malloc(A->size*sizeof(int));

    if(isempty(A)){
        printf("Stack is empty");
    }

    return 0;
}
 

в окне вывода должно быть «Стек пуст», но вместо этого оно пустое,
ошибки компиляции нет.
я застрял на этом на несколько часов, пожалуйста, помогите мне здесь.
я попробовал метод getch (), но он также не помогает.
я использую vscode.
Спасибо.

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

1. struct stack* A; не выделяет оперативной памяти, у вас есть указатель ни на что, а затем вы записываете в него. malloc сначала это. struct stack* A = (struct stack *)malloc(sizeof(*A));

2. спасибо Джеффри , это действительно сработало, большое спасибо.

3. Никаких проблем, однако, я предлагаю вам использовать метод @Jabberwocky, показанный ниже, и выделить его в стеке как локальный (обратите внимание на отсутствие a * ). Также при использовании malloc не забудьте free сделать это позже, чтобы не допустить утечки памяти.

4. большое спасибо, приятель. я буду иметь это в виду.

5. Это не имеет никакого отношения к проблеме, но то, как вы используете top , создаст проблемы позже. Я не хочу давать «окончательное решение», но способ проверить это самостоятельно. А именно «пройдите по краям». Сделайте несколько небольших рисунков, если хотите, и проверьте «ничего», «один» и «больше» случаев. Что делать, если размер == 0 и верх == ?. Что делать, если размер = 1 и верх == -1 или верх == 0, может ли верх когда-либо быть == 1… что делать, если размер == 2, какие значения могут быть у вершины -1, 0, 1, 2? И как он будет вести себя при добавлении новых значений / проверке, пуст ли стек или полон. Вы получите это, как только попробуете. Gl и HF

Ответ №1:

A вероятно, это не должно быть указателем, и вы, вероятно, хотите этого:

 int main()
{
  struct stack A;

  A.size = 10;
  A.top = -1;
  A.ptr = malloc(A.size * sizeof(int));

  if (isempty(amp;A)) {
    printf("Stack is empty");
  }

  return 0;
}
 

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

1. Как раз собирался опубликовать то же самое :)… в идеале тоже должен быть освобожден A.ptr до завершения, хотя.

Ответ №2:

при объявлении указателя структуры

 struct stack* A;
 

вы использовали его без выделения памяти и присвоения этой памяти «А». эта линия должна решить эту проблему.

 A = malloc(sizeof(struct stack));
 

Ответ №3:

Я не прошел весь код, так как увидел, что топ сравнивается с размером. Я думаю, что top-это индекс, поэтому он будет начинаться с 0. В то время как размер будет начинаться с 1. Может быть, вы пропали без вести на 1.

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

1. Возможно, вам следовало бы это сделать, но ничего не сработает, если он не сделает маллок *A

2. Я думаю, что он хотел написать struct stack A. Тогда ему следовало бы использовать указатель на него.

3. Вы явно новый пользователь SO, поэтому я объясню. Вас отвергают по этому поводу, потому что вы дали не только неправильный ответ, но и предположение. Слова «Я думаю» и заявление о том, что вы «не прошли весь код», должны были сказать вам, что вы не должны публиковать ответ.

4. Здесь проблема не в этом, и вполне допустимо начинать с индекса -1 для пустого стека. И размер 0 также является хорошим решением для пустого стека, поскольку он содержит 0 элементов.

5. @Джеффри да, сэр, это мой первый пост. И я понимаю, что ответ должен быть отклонен. мне следовало написать в комментариях, а не публиковать ответ. пожалуйста, примите мои извинения.