2017-02-19 35 views
-1

Я пытаюсь написать код, чтобы изобразить все основные операции стека, но как только я скомпилирую свой код и запустил его. Он сразу же перестает работать.Как разрешить ошибку времени выполнения в этом C-коде?

У меня нет ошибки компиляции в моей IDE (CodeBlocks). Как узнать, что является ошибкой в ​​моем коде?

Могу ли я также изменить настройки в CodeBlocks, чтобы также отображать такие ошибки времени выполнения?

Какая ошибка в моем коде ниже? Используется ли оператор стрелки (->) один за другим? Спасибо.

#include<stdio.h> 
#include<stdlib.h> 

typedef struct node 
{ 
    int data; 
    struct node *prev; 
}node; 

typedef struct stack 
{ 
    node *top; 
}stack; 

int count=0; 

void push(stack *x, int num) 
{ 
    node *temp; 
    if(x->top == NULL) 
    { 
     temp=(node *)malloc(sizeof(node *)); 
     temp->data=num; 
     temp->prev=NULL; 
     x->top=temp; 
    } 
    else 
    { 
     temp=(node *)malloc(sizeof(node *)); 
     temp->data=num; 
     temp->prev=x->top; 
     x->top=temp; 
    } 
    count++; 
    return; 
} 

int pop(stack *x) 
{ 
    node *temp; 
    int m; 
    if(x->top == NULL) 
    { 
     printf("Error:The stack is empty\n"); 
     return; 
    } 
    else 
    { 
     m=(x->top)->data; 
     temp=(x->top)->prev; 
     x->top=temp; 
    } 
    count--; 
    return m; 
} 
int main() 
{ 
    int k=1, n, num; 
    stack *myStack; 
    myStack->top = NULL; 
    while(k) 
    { 
     printf("Enter the operation you want to perform\n"); 
     printf("1.PUSH\n"); 
     printf("2.POP\n"); 
     printf("3.TOP\n"); 
     printf("4.STACK COUNT\n"); 
     scanf("%d", &n); 
     switch(n) 
     { 
      case 1: 
       printf("Enter the number you want to push to the stack\n"); 
       scanf("%d", &num); 
       push(myStack, num); 
       break; 
      case 2: 
       printf("The popped element is %d\n", pop(myStack)); 
       break; 
      case 3: 
       printf("The topmost element of the stack is %d\n", (myStack->top)->data); 
       break; 
      case 4: 
       printf("The number of elements in the stack are %d\n", count); 
       break; 
      default: 
       printf("Invalid request\n"); 
       break; 
     } 
     printf("Do you wish to perform another operation?(1/0)"); 
     scanf("%d", &k); 
    } 
    return 0; 
} 
+1

Вы устранения ошибок во время выполнения с помощью [отладки их] (https: // ericlippert. ком/2014/03/05 /, как в отладке-маленьких-программы /). Если причина ошибки неясна вам после того, как вы ее определили, задайте вопрос. – StoryTeller

+0

"* Как можно разрешить ошибку времени выполнения в этом C-коде? *": Компилировать с помощью символов, запускать код внутри отладчика, чтобы отслеживать программу по очереди, проверяя значения соответствующих переменных, чтобы узнать, что действительно происходит , – alk

+0

@alk Можете ли вы предложить какое-то приложение отладчика, которое я могу использовать для отладки кода C? –

ответ

1

Проблема с кодом является то, что он не выделяет память для структуры.

stack *myStack; 
    myStack->top = NULL; 

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

printf("Do you wish to perform another operation?(1/0)"); 
    scanf("%d", &k); 

Обычно, когда вы используете переменную или указатель на переменную, эта работа выделения памяти обрабатывается компилятором и операционной системы, так как размер этой переменной им известна, но когда вы используете стек (реализовано с использованием связанного списка), необходимо память на лету, так как пользователь определяет, сколько данных он/она хочет сохранить или удалить:

while(k) 
{ 
    printf("Enter the operation you want to perform\n"); 
    printf("1.PUSH\n"); 
    printf("2.POP\n"); 
    printf("3.TOP\n"); 
    printf("4.STACK COUNT\n"); 
    scanf("%d", &n); 
    switch(n) 

Отсюда возникает необходимость динамического распределения памяти. Посмотрите, как получить больший контроль над вашей памятью. Это дает вам право решать, что вы хотите делать с вашей памятью. Вы можете спросить операционную систему о любом желаемом размере памяти и сохранить ее с собой в течение какого-то времени, которое вы ожидаете.

Я думаю, что это отвечает на ваш вопрос «зачем нужна динамическая память».Теперь проблема с вашим кодом:

case 1: 
      printf("Enter the number you want to push to the stack\n"); 
      scanf("%d", &num); 
      push(myStack, num); 

Нет необходимости передавать какой-либо адрес какой-либо структуры функции push. Распределение памяти выполняется в вашей функции push. Поэтому вам нужно только:

push(num); 

Это означает, что вам необходимо изменить объявление функции и все определение с ней. Объявление функции должно выглядеть следующим образом:

Теперь измените определение функции по мере необходимости.

Кроме того, чтобы помочь вам узнать об ошибках во время выполнения, вы можете воспользоваться встроенным отладчиком IDE. Поэтому научитесь использовать его.

Кроме того, я думаю, что это может помочь, если вы читаете определенную главу о динамическом распределении памяти с хорошей книгой ваш друг рекомендует :)

+0

Спасибо. Это действительно помогло :) –

0
stack *myStack; 
myStack->top = NULL; 

Здесь myStack не указывает на какой-либо объект типа stack. Это просто неинициализированный указатель. Следовательно, когда вы пытаетесь установить значение для top, используя ->, отображается ошибка времени выполнения.

Вы можете начать с инициализацией myStack так:

stack *myStack = malloc (sizeof(stack)); 

Кроме того, есть утечка памяти в pop функции:

m=(x->top)->data; 
temp=(x->top)->prev; 
x->top=temp; // now x->top is pointing to x->top->prev 

Вы просочились память, указывающие на оригинальный node *, к которому myStack->top указывал, когда была вызвана функция pop.

+0

Почему мне даже нужно выделять память в стек? Зачем нужна динамическая память? –

+0

Вы правы, вам не нужна динамическая память. Тем не менее, я ответил на основе фрагмента кода, в котором вы использовали 'stack * myStack'. 'myStack' - указатель здесь. Вы можете создать 'stack myStack' и передать адрес' myStack' в ваших push и pop-функциях. – Rishi

0

посмотрите пожалуйста, думаю проблема проблема.

`

#include<stdio.h> 
#include<stdlib.h> 

typedef struct node 
{ 
    int data; 
    struct node *prev; 
}node; 

typedef struct stack 
{ 
    node *top; 
}; 

// struct stack myStack=NULL; 

int count=0; 

void push(stack *x, int num) 
{ 
    node *temp; 
    if(x->top == NULL) 
    { 
     temp=(node *)malloc(sizeof(node *)); 
     temp->data=num; 
     temp->prev=NULL; 
     x->top=temp; 
    } 
    else 
    { 
     temp=(node *)malloc(sizeof(node *)); 
     temp->data=num; 
     temp->prev=x->top; 
     x->top=temp; 
    } 
    count++; 
    return; 
} 

int pop(stack *x) 
{ 
    node *temp; 
    int m; 
    if(x->top == NULL) 
    { 
     printf("Error:The stack is empty\n"); 
     return 0; 
    } 
    else 
    { 
     m=(x->top)->data; 
     temp=(x->top)->prev; 
     x->top=temp; 
    } 
    count--; 
    return m; 
} 
int main() 
{ 
    int k=1, n, num; 
    printf("h"); 

    printf("h"); 
    stack *myStack = (struct stack*)malloc (sizeof(stack)); //myStack->top = NULL; 
    while(1) 
    { 
     printf("Enter the operation you want to perform\n"); 
     printf("1.PUSH\n"); 
     printf("2.POP\n"); 
     printf("3.TOP\n"); 
     printf("4.STACK COUNT\n"); 
     scanf("%d", &n); 
     switch(n) 
     { 
      case 1: 
       printf("Enter the number you want to push to the stack\n"); 
       scanf("%d", &num); 
       push(myStack, num); 
       break; 
      case 2: 
       printf("The popped element is %d\n", pop(myStack)); 
       break; 
      case 3: 
       printf("The topmost element of the stack is %d\n", (myStack->top)->data); 
       break; 
      case 4: 
       printf("The number of elements in the stack are %d\n", count); 
       break; 
      default: 
       printf("Invalid request\n"); 
       break; 
     } 
     printf("Do you wish to perform another operation?(1/0)"); 
     scanf("%d", &k); 
    } 
    return 0; 
} 

`

 Смежные вопросы

  • Нет связанных вопросов^_^