2016-04-14 126 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