2016-04-14 4 views
0

Я пытаюсь создать стек, используя связанный список, но получаю ошибку EXC_BAD_ACCESS в моем методе linkedListStackInit;Не удается инициализировать связанный список

LinkedList.h

#ifndef LinkedListStack_h 
#define LinkedListStack_h 

#ifndef __TYPE 
#define __TYPE 
#define TYPE int 
#define TYPE_SIZE sizeof(int) 
#endif 

#include <stdio.h> 

struct Link; 
struct LinkedListStack; 
void linkedListStackInit(struct LinkedListStack *s); 
void push(struct LinkedListStack *s, TYPE data); 
void pop(struct LinkedListStack *s); 
TYPE top(struct LinkedListStack *s); 
int isEmpty(struct LinkedListStack *s); 

#endif 

LinkedList.c

#include <stdlib.h> 
#include "LinkedListStack.h" 

struct Link { 
    TYPE value; 
    struct Link *next; 
}; 

struct LinkedListStack { 
    struct Link *firstLink; 
}; 

void linkedListStackInit(struct LinkedListStack *s) { 
    s->firstLink = 0; 
} 

void push(struct LinkedListStack *s, TYPE data) { 
    struct Link *newLink = malloc(sizeof(struct Link)); 
    // Assert? 
    newLink->next = s->firstLink; 
    newLink->value = data; 
    s->firstLink = newLink; 
} 

void pop(struct LinkedListStack *s) { 
    struct Link *temp = s->firstLink; 
    s->firstLink = s->firstLink->next; 
    free(temp); 
} 

TYPE top(struct LinkedListStack *s) { 
    return s->firstLink->value; 
} 

int isEmpty(struct LinkedListStack *s) { 
    if(s == NULL) { 
     return 0; 
    } 
    else { 
     return 1; 
    } 
} 

main.c

#include <stdio.h> 
#include <stdlib.h> 
#include "LinkedListStack.h" 

int main(int argc, const char * argv[]) { 

    struct LinkedListStack *s; 
    linkedListStackInit(s); 

    return 0; 
} 
+2

это поле TYPE, что вы копируете в поле значения от Link структуры больше, чем в междунар? – bruceg

+0

В какой строке ваш отладчик говорит вам об ошибке? И тогда каковы значения любых соответствующих указателей на этой строке? Если по какой-то причине отладчик не может помочь вам найти проблему, пожалуйста, напишите [минимальный полный и проверяемый пример] (http://stackoverflow.com/help/mcve). – kaylum

+0

Итак, я понял, что ошибка возникает, как только я пытаюсь инициализировать связанный список. Я опубликовал весь код, поэтому это должно быть более понятным. – 123

ответ

1

Из основного метода вы вызываете function linkedListStackInit и передать ему стек (ы). Но вы не выделили память для s, прежде чем передавать ее функции linkedListStackInit. Функция linkedListStackInit также не выделяет память и пытается присвоить значение члену «firstlink». Попробуйте сделать следующее в вашей функции linkedListStackInit и посмотреть, сможете ли вы продолжить.

s = malloc(sizeof(struct LinkedListStack));

+0

Я получаю ту же самую проблему 'EXC_BAD_ACCESS' в моей' push' функции. Я правильно распределяю память там, или есть проблема в этом? – 123

+0

Также в вашей основной функции вы, кажется, ничего не делаете, кроме инициализации своего стека, вызывая метод linkedListStackInit. Вы не называете push или pop. – VHS

+0

Правильно, я говорю, если я использую 'push', я все равно получаю ту же ошибку, хотя я думаю, что я правильно выделил память для новой ссылки в' push() '. – 123

Смежные вопросы