为什么我在这个STACK程序中得到这个数字而不是值?

时间:2017-12-04 12:37:50

标签: c stack undefined-behavior

在C中的堆栈程序的实现中,当我打印pop()的值时,为什么我得到那个数字?它应该印有' 4'但我得到一个像号码的地址。这可能是什么问题?

#define MAX 5

typedef struct stack{
    int data[MAX];
    int top;
}stack;

int empty(stack *s){
    if(s->top==-1)
        return 1;
    return 0;
}

int pop(stack *s){
    int x;
    x = s->data[s->top];
    s->top = s->top -1;
    return x;

}

void display(stack *s){

    while(!(empty(&s)) && (s->top)!=-1){
        printf("%d\n",s->data[s->top]);
        s->top=s->top-1;
    }

}


int main()
{
    stack s;
    init(&s);
    push(&s,2);
    push(&s,3);
    push(&s,4);
    display(&s);
    printf("Popped element is: ");
    printf("%d",pop(&s));
    return 0;
}

输出:

4
3
2
Popped element is: 4200976   
Process returned 0 (0x0)   execution time : 0.019 s
Press any key to continue.

2 个答案:

答案 0 :(得分:2)

在显示功能之后,您的top将始终具有值-1。 使用pop函数时,它将返回数组中的第-1个元素。 这是未定义的行为,因此返回的x可以是任何内容。

答案 1 :(得分:0)

函数display无效。

对于初学者来说,这个电话

!(empty(&s))

的参数类型为stack **,而参数类型为stack *。应该有

!(empty(s))

虽然这项检查是多余的,可能会被删除。

该函数更改堆栈的数据成员top。结果,在函数pop之后调用的函数display具有未定义的行为。

该功能可以看起来像

void display(const stack *s)
{
    for ( int i = s->top; i != -1; i-- )
    {
        printf("%d\n",s->data[i]);
    }
}

这是一个示范程序

#include <stdio.h>

#define MAX 5

typedef struct stack
{
    int data[MAX];
    int top;
}   stack;

void init( stack *s )
{
    s->top = -1;
}

int empty( const stack *s )
{
    return s->top == -1;
}

void push( stack *s, int x )
{
    if ( s->top + 1 != MAX ) s->data[++s->top] = x;
}

int pop( stack *s )
{
    int x  = s->data[s->top--];
    return x;
}

void display(const stack *s)
{
    for ( int i = s->top; i != -1; i-- )
    {
        printf("%d\n",s->data[i]);
    }
}

int main(void) 
{
    stack s = { { 0 }, -1 };

    init( &s );

    push (&s, 2 );
    push( &s, 3 );
    push( &s, 4 );
    display( &s );

    printf( "Popped element is: " );
    printf( "%d\n", pop( &s ) );

    return 0;
}

产生预期结果

4
3
2
Popped element is: 4