我在代码块中编写的Stack实现代码是成功编译但在运行时显示错误

时间:2018-03-05 04:50:30

标签: c data-structures ide stack codeblocks

我附上了运行时错误的屏幕截图。

此代码将创建一个堆栈

#include <stdio.h>
#include <stdlib.h>
#define SIZE 5         
// Declared a Structure with top,an array as its members

     struct Stack {  
     int items[SIZE],top;  

     };


//push method inserts an element in the stack

void push(struct Stack *s1,int x){   
    s1->items[++s1->top]=x;
}

// pop  method is for Removing the Elements

void pop(struct Stack* s1){  
    printf("Before pop the Top is %d ",s1->top);
    int a=s1->items[s1->top--];
    printf("After pop the Top is %d",s1->top);
}


//Main method


void main() {
    struct Stack s,*s1;
    struct Stack top = {-1};    //Initializing Top variable in Structure 
    int n;

    //loop to insert the elements

     for(int i=0;i<SIZE;i++){
     printf("Enter the elements to be pushed");
     scanf("%d",&n);
     push( s1, n);
      }
    pop(s1);
    pop(s1);

    printf("The Elements of the Stack after performing all the operations are   ");

    // Print the elements of the stack

    for(int i=0;i<SIZE;i++) {  
     printf("%d",s1->items[SIZE]); 

    }

}

2 个答案:

答案 0 :(得分:1)

有很多问题:

这是您程序的更正版本。所有更正都被评论。 代码仍然很草率(例如,没有错误检查,变量名称毫无意义)但至少它是有效的。

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

#define SIZE 5         

struct Stack {
  int items[SIZE];
  int top;             // better readability
};


// push method inserts an element in the stack

void push(struct Stack *s1, int x) {
  s1->items[++s1->top] = x;
}

// pop  method is for removing ONE Element  // COMMENT CORRECTED

int pop(struct Stack* s1) {   // we need to return the popped element
  printf("Before pop the Top is %d\n", s1->top);
  int a = s1->items[s1->top--];
  printf("After pop the Top is %d\n", s1->top);
  return a;
}


int main() {        // main must return an int
  struct Stack s;   // removed useless s1 ansd top variables
                    // BTW s1 was an uninitialized pointer so this was
                    // totally wrong
  int n;

  s.top = -1;       // initialize top correctly 
                    // struct Stack s = {-1}  will not initialize s.top !!

  for (int i = 0; i<SIZE; i++) {
    printf("Enter the elements to be pushed: ");
    scanf("%d", &n);
    push(&s, n);
  }

  printf("First popped value: %d\n", pop(&s));   // print popped elements
  printf("Second popped value: %d\n", pop(&s));

  printf("The Elements of the Stack after performing all the operations are: ");

  for (int i = 0; i <= s.top; i++) {   //i <= top instead of i < SIZE
    printf("%d\n", s.items[i]);        // s.items[i] instead of s.items[SIZE]
  }
}

答案 1 :(得分:0)

我将指出代码中的一些主要问题。 编程时请注意这些。

push()和pop()方法似乎没问题。

您的程序成功符合,因为它没有任何语法错误。 编译器无法识别运行时错误,例如由于内存管理,逻辑错误等引起的错误。因此,编译代码意味着您没有正确的答案。您需要使用打印件或其他内容调试每一行,以跟踪程序在崩溃之前的工作量。

在此程序中,由于内存管理问题,您会出现分段错误。 因为在这里你使用指针s1作为push()和pop()函数的参数。 但是你的指针s1没有用struct Stack变量初始化。因此,s1指向任意内存位置,并且不允许修改该内存位置的数据并导致分段错误。

你可以看到@Michael Walz给出的代码已经纠正了这个问题。

struct Stack s;     //This variable is statically allocated and has enough memory
struct Stack *s1;   //Pointer variable stores only address of the struct no memory
                    //for struct is allocated. Dynamic allocation is required

可以通过以下方式将内存分配给指针变量s1。

//Dyanmic memory allocation from heap
s1 = (struct Stack*)malloc(sizeof(struct Stack));

或指定已分配变量的地址,如

struct Stack s, *s1;
s1=&s;

现在s1将指向一个有效的struct Stack对象,因此可以避免由于引用禁止的内存位置而导致的分段错误。

您编写的以下代码实际上并未初始化struct

中的top变量
struct Stack top = {-1};

这将创建另一个名为top的Stack结构,并将数组项[]中的第一个元素创建为-1。

访问struct的元素如下

struct Stack s;
struct Stack *s1; 
s.top = -1;      //Statically allocated. Referencing by '.'
s1->top = -1;    //Referencing by '->' for pointers

注意: 一个很好的链接,建议如何进行结构初始化。这个链接提到了许多不同的可能性。很高兴看看。 http://en.cppreference.com/w/c/language/struct_initialization