求解决办法,关于程序发生段异常的有关问题!求好心人帮助1!

求解决方法,关于程序发生段错误的问题!!!求好心人帮助1!!
小弟在编写一段状态机的程序时发生一个很奇怪的问题,由于是新手,不知道问题出在哪里了,希望有好心人帮助一下。。。
  问题就出现在下面一个状态后,一旦输入1后就弹出内存问题:


弹出问题如下:


我已经要吐了,求好心人帮助一下到底问题出在哪里?新手不容易啊。。。

附:代码如下
// sdl.cpp : Defines the entry point for the console application.
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "stdafx.h"
typedef struct sdltag
{
int state;
int timeout;
}sdl;

int PD = 0;
int isIDRight = 0;
int isHBRej = 0;
int isSupportFrequencyChange = 0;
int isADM_RES = 0;
int isREJ = 0;
int isEMPTY = 0;
int EMPTY_1 = 0;
int isACK = 0;
int isLastACK = 0;
int isUL_REP = 0;
int isLastUL_REP = 0;
int isLI_UP = 0;

int main(int argc, char* argv[])
{
int a = 0;
int b1 = 0;
int b1_2 = 0;
int b2 = 0;
int i = 0;
sdl s;
s.state = 0;
s.timeout = 0;
while(1)
{
switch(s.state)
{
case 0:
puts("HM loading, Set(TL1)...\nWaiting for PD(0/1)");
scanf("%d", &PD);
/*TL1 control*/
if(a<32)
{
if(PD)
{
puts("Accept PD...\nisIDRight(0/1), isHBRej(0/1)");
scanf("%d %d", &isIDRight, &isHBRej);
if(isIDRight || isHBRej)
{
printf("Channel %d is unaccessable!\nWaiting for isSupportFrequencyChange(0/1)\n", a);
scanf("%d", &isSupportFrequencyChange);
if(isSupportFrequencyChange)
{
a=a+1;
s.state = 0;
break;
}
else
{
puts("Channel is busy! Waiting for the next access chance\n");
s.state = 0;
break;
}
}
else
{
printf("Channel %d is IDLE, Access Begin, Set(TL2)\n", a);
puts("DLINK Parameter collect over, delete(TL2), Set(TA1),Sending ADM_REQ!\n");
puts("State 0 is over, turn to state 1");
s.state = 1;
break;
}
}
else
{
printf("Channel %d is unaccessable!\nWaiting for isSupportFrequencyChange(0/1)", a);
scanf("%d", &isSupportFrequencyChange);
if(isSupportFrequencyChange)
{
a=a+1;
s.state = 0;
break;
}
else
{
puts("Channel is busy! Waiting for the next access chance\n");
s.state = 0;
break;
}
}
}
else
{
puts("All channels are busy! Waiting for next access!\n");
s.state = 0;
break;
}

case 1:
/*set(T01) T01 control
TA1 control*/
if(b1<3)
{
puts("Sending ADM_REQ...\nwaiting for isADM_RES(0/1), isREJ(0/1), isEMPTY(0/0)");
scanf("%d %d %d", &isADM_RES, &isREJ, &isEMPTY);
if(isADM_RES)
{
for(i=0;i<3;i++)
{
puts("Accept ADM_RES, Sending ADM_ACK, Reset(T01)\nWaiting for EMPTY_1(0/1)");
scanf("%d", &EMPTY_1);
if(EMPTY_1)
{
puts("Accept EMPTY(0,1), Sending DLINK_REPORT\n");
puts("State 1 over, turn to State 2!\n");
s.state = 2;
break;
}
else if(b1_2 <2)
{
b1_2 += 1;
}
else
{
puts("Can not accept EMPTY(0,1),Send HM_REPORT, back to State 0!\n");
s.state = 0;
break;
}
}