从堆栈中检索项目时C程序崩溃

Gar*_*hby 0 c stack pointers

以下代码在第二次Pop()调用时崩溃.我是C的新手,我现在一直盯着这段代码超过一个小时,我看不出错误.任何想法,以帮助我解释为什么这个代码崩溃?

#include <stdio.h>

#define StackDataSize 100

typedef struct Stack
{
    int index;
    void *data[StackDataSize];
} Stack;

void* Pop(Stack *s)
{
    if(s->index >= 0)
    {
        return s->data[s->index--];
    }
    else
    {
        fprintf(stderr, "ERROR: Stack Empty\n");
        return NULL;
    }
}

void Push(Stack *s, void *v)
{
    if(s->index < StackDataSize)
    {
        s->data[++s->index] = v;
    }
    else
    {
        fprintf(stderr, "ERROR: Stack Full\n");
    }
}

int main(void)
{
    Stack s = {-1}, *intstack = &s;

    int x = 123456;
    Push(intstack, &x);

    printf("%d\n", *(int*)Pop(intstack));
    printf("%d\n", *(int*)Pop(intstack));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ham 11

在第二个Pop上,堆栈为空,如果堆栈为空,Pop返回NULL.

所以在第二行:

printf("%d\n", *(int*)Pop(intstack));
Run Code Online (Sandbox Code Playgroud)

你正在取消引用NULL作为指向int.

printf("%d\n", *(int*)NULL );
Run Code Online (Sandbox Code Playgroud)


sth*_*sth 6

第二个pop尝试从空堆栈弹出,然后Pop()函数返回NULL.然后main函数尝试取消引用此NULL-pointer并打印它指向的值.

由于NULL指针不指向任何有效的东西,因此会出现分段错误.