我正在尝试编写一个代码来描述堆栈的所有基本操作,但是只要我编译代码并运行它。它会立即停止工作。
我的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;
}
答案 0 :(得分: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)
因此需要动态内存分配。将其视为对记忆的更大控制。它让你有能力决定你想要用你的记忆做什么。您可以向操作系统询问您想要的任何大小的内存,并在您想要的任何时间内随身携带。
我认为这可以回答你的问题,为什么动态记忆&#39;题。现在您的代码存在问题:
case 1:
printf("Enter the number you want to push to the stack\n");
scanf("%d", &num);
push(myStack, num);
不需要将任何结构的任何地址传递给push函数。内存分配在push函数中处理。所以你只需要:
push(num);
这意味着您需要使用它更改函数声明和整个定义。函数声明应该如下:
node* push(int);
现在,根据需要修改函数定义。
另外,为了帮助您找出运行时错误,您可以借助IDE的内置调试器。所以学习如何使用它。
另外我认为如果你从朋友推荐的好书中读到关于动态内存分配的某一章可能会有所帮助:)
答案 1 :(得分: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
的内存泄露。
答案 2 :(得分: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;
}
`