我正在尝试编写代码来描述堆栈的所有基本操作,但是一旦编译并运行它,我就会开始编写代码。它立即停止工作。
我的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;
}
您的代码的问题在于它没有为该结构分配任何内存。
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(num);
这意味着您需要使用它来更改函数声明和整个定义。函数声明应如下所示:
node* push(int);
现在,根据需要修改函数定义。
另外,为帮助您找出运行时错误,您可以借助IDE的内置调试器。因此,学习如何使用它。
我还认为,如果您从朋友的推荐书中读到有关动态内存分配的特定章节,可能会有所帮助:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句