gpt4 book ai didi

c - 如何解决此 C 代码中的运行时错误?

转载 作者:行者123 更新时间:2023-11-30 19:09:56 25 4
gpt4 key购买 nike

我正在尝试编写一段代码来描述堆栈的所有基本操作,但是一旦我编译代码并运行它。它立即停止工作。

我的 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(num);

这意味着您需要更改函数声明和整个定义。函数声明应如下所示:

node* push(int);

现在,根据需要修改函数定义。

此外,为了帮助您找出运行时错误,您可以借助 IDE 的内置调试器。所以学习如何使用它。

另外,我认为如果您从 friend 推荐的一本好书中阅读有关动态内存分配的特定章节可能会有所帮助:)

关于c - 如何解决此 C 代码中的运行时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42325309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com