#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. @Джеффри да, сэр, это мой первый пост. И я понимаю, что ответ должен быть отклонен. мне следовало написать в комментариях, а не публиковать ответ. пожалуйста, примите мои извинения.