以下代码在第二次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)
第二个pop尝试从空堆栈弹出,然后Pop()函数返回NULL.然后main函数尝试取消引用此NULL-pointer并打印它指向的值.
由于NULL指针不指向任何有效的东西,因此会出现分段错误.