2014-09-19 4 views
0

Я пытаюсь написать программу для проверки сбалансированных круглых скобок, но когда я пытаюсь инициализировать стек/массив, я получаю плохой доступ (код = 1, адрес 0x0).EXC_BAD_ACCESS в реализации стека

Вот код:

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

#define TRUE 1 
#define FALSE 0 

#define MAX_STRING_LEN 1000 
#define MAX_STACK_SIZE 5000 

typedef char StackElement; 

typedef struct Stack{ 
    StackElement *content; 
    int maxSize; 
    int top; 
}Stack; 


void Init(Stack*stack); 
void Destroy(Stack*stack); 
void Push(Stack*stack, StackElement element); 
StackElement Pop(Stack*stack); 
int IsEmpty(Stack*stack); 
int IsFull(Stack*stack); 



/* 
* A new stack variable is initialized. The initialized 
* stack is made empty. MaxSize is used to determine the 
* maximum number of character that can be held in the 
* stack. 
*/ 
void Init(Stack *stack) 
{ 
    StackElement *newContent; 

    /* Allocate a new array to hold the content.*/ 
    newContent = (StackElement*)malloc(sizeof(StackElement)* MAX_STACK_SIZE); 

    if (newContent == NULL) { 
     printf("Insufficient memory to initialize stack.\n"); 
     exit(1);/* Exit, returning error code.*/ 
    } 

    stack->content = newContent; 
    stack->maxSize = MAX_STACK_SIZE; 
    stack->top = -1; 
} 

int CheckBalancedParentheses (char* expression){ 
    int i = 0; 
    Stack *stack; 
    Init(stack); 

    if (strcmp(&expression[i], ")") == 0 || strcmp(&expression[i], "]") == 0 || strcmp(&expression[i], "}") == 0){ 
     return FALSE; 
    } 

    for (i = 0; i < strlen(expression); i++){ 
     if (strcmp(&expression[i], "(") == 0 || strcmp(&expression[i], "[") == 0 || strcmp(&expression[i], "{") == 0){ 
      Push(stack, expression[i]); 
     } 
    } 

    return TRUE; 
} 

Плохой доступ происходит на всех этих линий (я проверил их по отдельности):

stack->content = newContent; 
stack->maxSize = MAX_STACK_SIZE; 
stack->top = -1; 

Я не могу понять, почему это дает мне плохой доступ, любая помощь/совет будут оценены!

Благодарим вас за продвижение.

+1

'Пакетирование> content':' stack' является NULL. – BLUEPIXY

+2

@BLUEPIXY 'stack' _uninitialized_. – AlexD

+1

@ AlexD Неподтвержден. – BLUEPIXY

ответ

1

Вы указали указатель стека, это не выделяет память.

Вы должны таНос заявление в CheckBalancedParentheses перед вызовом Init:

/* Allocate memory for our stack */ 
Stack* stack = malloc(sizeOf(Stack)); 
Смежные вопросы