2016-04-14 129 views
0

我试图使用链接列表构建堆栈,但在linkedListStackInit方法中出现EXC_BAD_ACCESS错误;无法初始化链表

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

是,你复制到链接结构大于int的值字段类型字段? – bruceg

+0

你的调试器告诉你错误发生在哪一行?那么这条线上的任何相关指针的价值是什么?如果由于某种原因调试器无法帮助您找到问题,请发布[最小完整且可验证的示例](http://stackoverflow.com/help/mcve)。 – kaylum

+0

好吧,所以我意识到,只要我尝试初始化链表时就会发生错误。我发布了所有的代码,所以这应该更容易理解。 – 123

回答

1

从你的主要方法,您呼叫的函数linkedListStackInit并将堆栈传递给它。但是在将它传递给linkedListStackInit函数之前,您尚未将内存分配给s。函数linkedListStackInit不会分配内存,并尝试为其“firstlink”成员分配一个值。尝试在linkedListStackInit函数中执行以下操作,看看是否可以继续下一步。

s = malloc(sizeof(struct LinkedListStack));

+0

我在'push'函数中得到了同样的'EXC_BAD_ACCESS'问题。我是否正确地分配了那里的记忆,还是有问题呢? – 123

+0

同样在你的主函数中,除了通过调用linkedListStackInit方法来初始化你的堆栈之外,你似乎没有做任何事情。你不是在呼叫推送或流行音乐。 – VHS

+0

对,我在说如果我使用'push',我仍然得到同样的错误,尽管我认为我已经在'push()'中正确地分配了一个新链接的内存。 – 123