堆栈没有弹出正确的值:C

时间:2016-11-18 15:34:34

标签: c pointers stack memory-address pop

我似乎无法让我的堆栈运行......堆栈。它似乎正确编译,从我的理解,推送和弹出功能正确写入(但它们可能是错误的)。

我尝试将2个整数推入堆栈,然后再将它们弹出以进行测试,但是它会弹出我看来是整数形式的内存地址,但是可能不是这种情况。无论哪种方式,它都没有弹出正确的值,我无法找到任何明显的代码。

重要的是要注意弹出的值似乎不会通过多次迭代而改变,但我认为malloc调用无论如何都会阻止它。我使用的是代码中包含的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;
}

2 个答案:

答案 0 :(得分:1)

big 主要问题是,当您使用malloc分配内存时,它不会以任何方式初始化内存。内存的内容是不确定

这意味着当您在TopStack函数中为initTOS分配内存时,结构top指针很可能不是NULL以及num不是零。然后,您开始使用这些值,您将拥有未定义的行为

您应该在initTOS中初始化内存。通过使用calloc代替,或明确设置每个成员。

您似乎也遇到了其他未初始化的变量和数据的问题。

答案 1 :(得分:1)

函数http://MyServer/MyApi/GetBanner 中的

pTemp在未初始化时使用。使用具有自动存储持续时间的未初始化变量中的值将调用未定义的行为

该行

pop

应该是

Stack *pTemp;

此外,您必须在Stack *ptemp = ts->top; 中将pTopStack->num初始化为零,否则您将再次调用未定义的行为以使用通过initTOS()分配的缓冲区中的值没有初始化。

另一个注意事项是他们说you shouldn't cast the result of malloc() in C