括号匹配的检验问题 Thread 1: EXC_BAD_ACCESS (code=1, address=0x18)停在pS->pTop->pNext=NULL 这一行

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

typedef struct Node{
int data;
struct Node * pNext;
}NODE,*PNODE;

typedef struct Stack{
PNODE pTop;
PNODE pBottom;
}STACK,*PSTACK;

void Ini(PSTACK);
void Push(PSTACK,char);
bool is_empty(PSTACK);
bool matching_progress(char*);
bool Pop(PSTACK,char*);

int main() {
char str[100];
//scanf("%s",str);
gets(str);
/* if(str[0]==')'||str[0]==']'||str[0]=='}'){
printf("括号不匹配");
}*/
if(matching_progress(str))
printf("right");
else printf("wrong");
return 0;
}

void Ini(PSTACK pS){
pS->pTop=(PNODE)sizeof(NODE);
if(pS->pTop==NULL) {printf("动态分配内存失败");exit(-1);}
pS->pBottom=pS->pTop;
pS->pTop->pNext=NULL;
}
void Push(PSTACK pS,char val){
PNODE pNew=(PNODE)malloc(sizeof(NODE));
pNew->data=val;
pNew->pNext=pS->pTop;
pS->pTop=pNew;
}
bool is_empty(PSTACK pS){
if(pS->pTop==pS->pBottom) return true;
else return false;
}

bool Pop(PSTACK pS,char*pVal){
if(is_empty(pS)){
return false;
}
else {
PNODE r=pS->pTop;
*pVal=r->data;
pS->pTop=r->pNext;
free(r);
r=NULL;
return true;
}
}
bool matching_progress(char *abc){
STACK S;
Ini(&S);

char b;
int i;
for(i=0;i<strlen(abc);i++){
    switch(abc[i]){
        case'{':
        case'[':
        case'(':
            Push(&S, abc[i]);
            break;
            
        case'}':
        
            if(is_empty(&S)) return false;
            else{
                Pop(&S, &b);
                if(b!='{') return false;
                break;
            }
            
        case']':
        
            if(is_empty(&S)) return false;
            else{
                Pop(&S, &b);
                if(b!='[') return false;
                break;
            
            }
        case')':
        
            if(is_empty(&S)) return false;
            else{
                Pop(&S, &b);
                if(b!='(') return false;
                break;
            
            }
        default:break;
            
    }

}
if(is_empty(&S)==0) return false;
else return true;
}

pS->pTop=(PNODE)sizeof(NODE);
改为
pS->pTop=(PNODE)malloc(sizeof(NODE));