堆栈不弹出正确的值
Stack not popping correct values
我似乎也无法让我的堆栈运行...堆栈。它似乎符合要求,据我所知,push 和 pop 函数的编写是正确的(但它们可能是错误的)。
我试图将 2 个整数压入堆栈,然后再次将它们弹出以进行测试,但弹出的内容在我看来是整数形式的内存地址,但这可能不是案子。无论哪种方式,它都没有弹出正确的值,而且我找不到任何明显的代码。
重要的是要注意弹出的值似乎不会通过几次迭代而改变,但我认为 malloc 调用无论如何都会阻止这种情况。我正在使用 Code:blocks 中包含的 GNU GCC 编译器.
下面是 lib.c 文件:
#include "defs.h"
//Initialising the stack
TopStack* initTOS()
{
TopStack* pTopStack;
pTopStack = (TopStack*)malloc(sizeof(TopStack));
return (pTopStack);
}
//Pushing an element onto the stack
void push(TopStack* ts, int val)
{
if (ts->num == 0) {
Stack* pNewNode;
pNewNode = (Stack*)malloc(sizeof(Stack));
pNewNode->val = val;
pNewNode->next = NULL;
ts->top = pNewNode;
ts->num++;
}
else if (ts->num != 0) {
Stack* pNewNode;
pNewNode = (Stack*)malloc(sizeof(Stack));
pNewNode->val = val;
pNewNode->next = ts->top;
ts->top = pNewNode;
ts->num++;
}
}
int pop(TopStack* ts)
{
if (ts->num == 0) {
printf("Can't pop, stack is empty!\n");
exit(1);
}
else {
Stack* pTemp;
int RemovedValue;
RemovedValue = pTemp->val;
ts->top = pTemp->next;
ts->num--;
free(pTemp);
return (RemovedValue);
}
}
void testStack(TopStack* ts)
{
int RemovedValue;
push(ts, 1);
push(ts, 2);
printf("the popped value was %i\n", pop(ts));
printf("the popped value was %i\n", pop(ts));
}
结构存储在defs.h中:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <assert.h>
#include <stdbool.h>
#define MAX_EXPR 50
//struct that contains stack's element
typedef struct stack_elem {
int val;
struct stack_elem* next;
} Stack;
//struct that contains the pointer to the top of the stack
typedef struct {
int num; //num of elements in stack
Stack* top;
; //top of stack
} TopStack;
//ts=pointer to the top of stack, val=element to push
void push(TopStack* ts, int val); //push element on the stack
//prints the elements in the stack
void printStack(TopStack* ts);
// initialize the structure that will point to the top of the stack
TopStack* initTOS();
// a simple test for the stack
void testStack(TopStack* ts);
// ts=pointer to the top of stack
int pop(TopStack* ts); //returns element from top of stack
// simple parser function for RPN expressions that assumes numbers have only one digit
void parseRPN(char expr[], TopStack* st);
// empties the stack using the pop operation
void emptyStack(TopStack* ts);
// performs the operation defined by character op on the elements on top of stack
void performOp(TopStack* st, char op);
最后 main.c 文件:
#include "defs.h"
int main()
{
TopStack* tp;
tp = initTOS(); // initialize the top of stack structure
testStack(tp); // this function tests your stack
return EXIT_SUCCESS;
}
一个big和major的问题是当你用malloc
分配内存时,它没有初始化内存反正。内存内容不确定.
这意味着当您在 initTOS
函数中为 TopStack
分配内存时,结构 top
指针很可能不会是 NULL
以及 num
不为零。然后你开始使用这些值,你将有 undefined behavior.
你应该在initTOS
中初始化内存。通过使用 calloc
代替,或显式设置每个成员。
您似乎对其他未初始化的变量和其他地方的数据也有问题。
函数 pop
中的 pTemp
在未初始化时使用。在具有自动存储持续时间的未初始化变量中使用值将调用未定义的行为。
行
Stack *pTemp;
应该是
Stack *ptemp = ts->top;
您还必须在 initTOS()
中将 pTopStack->num
初始化为零,否则您将再次调用 未定义行为 以使用通过 [ 分配的缓冲区中的值=16=] 且未初始化。
另一个注意事项是他们说 you shouldn't cast the result of malloc()
in C。
我似乎也无法让我的堆栈运行...堆栈。它似乎符合要求,据我所知,push 和 pop 函数的编写是正确的(但它们可能是错误的)。
我试图将 2 个整数压入堆栈,然后再次将它们弹出以进行测试,但弹出的内容在我看来是整数形式的内存地址,但这可能不是案子。无论哪种方式,它都没有弹出正确的值,而且我找不到任何明显的代码。
重要的是要注意弹出的值似乎不会通过几次迭代而改变,但我认为 malloc 调用无论如何都会阻止这种情况。我正在使用 Code:blocks 中包含的 GNU GCC 编译器.
下面是 lib.c 文件:
#include "defs.h"
//Initialising the stack
TopStack* initTOS()
{
TopStack* pTopStack;
pTopStack = (TopStack*)malloc(sizeof(TopStack));
return (pTopStack);
}
//Pushing an element onto the stack
void push(TopStack* ts, int val)
{
if (ts->num == 0) {
Stack* pNewNode;
pNewNode = (Stack*)malloc(sizeof(Stack));
pNewNode->val = val;
pNewNode->next = NULL;
ts->top = pNewNode;
ts->num++;
}
else if (ts->num != 0) {
Stack* pNewNode;
pNewNode = (Stack*)malloc(sizeof(Stack));
pNewNode->val = val;
pNewNode->next = ts->top;
ts->top = pNewNode;
ts->num++;
}
}
int pop(TopStack* ts)
{
if (ts->num == 0) {
printf("Can't pop, stack is empty!\n");
exit(1);
}
else {
Stack* pTemp;
int RemovedValue;
RemovedValue = pTemp->val;
ts->top = pTemp->next;
ts->num--;
free(pTemp);
return (RemovedValue);
}
}
void testStack(TopStack* ts)
{
int RemovedValue;
push(ts, 1);
push(ts, 2);
printf("the popped value was %i\n", pop(ts));
printf("the popped value was %i\n", pop(ts));
}
结构存储在defs.h中:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <assert.h>
#include <stdbool.h>
#define MAX_EXPR 50
//struct that contains stack's element
typedef struct stack_elem {
int val;
struct stack_elem* next;
} Stack;
//struct that contains the pointer to the top of the stack
typedef struct {
int num; //num of elements in stack
Stack* top;
; //top of stack
} TopStack;
//ts=pointer to the top of stack, val=element to push
void push(TopStack* ts, int val); //push element on the stack
//prints the elements in the stack
void printStack(TopStack* ts);
// initialize the structure that will point to the top of the stack
TopStack* initTOS();
// a simple test for the stack
void testStack(TopStack* ts);
// ts=pointer to the top of stack
int pop(TopStack* ts); //returns element from top of stack
// simple parser function for RPN expressions that assumes numbers have only one digit
void parseRPN(char expr[], TopStack* st);
// empties the stack using the pop operation
void emptyStack(TopStack* ts);
// performs the operation defined by character op on the elements on top of stack
void performOp(TopStack* st, char op);
最后 main.c 文件:
#include "defs.h"
int main()
{
TopStack* tp;
tp = initTOS(); // initialize the top of stack structure
testStack(tp); // this function tests your stack
return EXIT_SUCCESS;
}
一个big和major的问题是当你用malloc
分配内存时,它没有初始化内存反正。内存内容不确定.
这意味着当您在 initTOS
函数中为 TopStack
分配内存时,结构 top
指针很可能不会是 NULL
以及 num
不为零。然后你开始使用这些值,你将有 undefined behavior.
你应该在initTOS
中初始化内存。通过使用 calloc
代替,或显式设置每个成员。
您似乎对其他未初始化的变量和其他地方的数据也有问题。
pop
中的 pTemp
在未初始化时使用。在具有自动存储持续时间的未初始化变量中使用值将调用未定义的行为。
行
Stack *pTemp;
应该是
Stack *ptemp = ts->top;
您还必须在 initTOS()
中将 pTopStack->num
初始化为零,否则您将再次调用 未定义行为 以使用通过 [ 分配的缓冲区中的值=16=] 且未初始化。
另一个注意事项是他们说 you shouldn't cast the result of malloc()
in C。