2016-03-06 94 views
1

我想寫一個「ArrayList」程序(類似於Java ArrayList),它將使用realloc自動擴展,以便程序員不必擔心存儲空間陣列。這是我的代碼:訪問結構中的數組元素的錯誤

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

#define ARR_DEFAULT_SIZE 20 
#define INCR 10 

#define ARRTYPE char // Files using this #undef this macro and provide their own type 

typedef struct { 
    ARRTYPE *arr; 
    long size; 
    long nextincr; 
} arrlst; 

arrlst *nlst(void); 
void add(arrlst *, ARRTYPE); 
ARRTYPE elmat(arrlst *, long); 

int main(int argc, char **argv) { 
    arrlst *lst = nlst(); 
    add(lst, 'h'); 
} 

arrlst *nlst() { 
    arrlst lst = { malloc(ARR_DEFAULT_SIZE), 0, ARR_DEFAULT_SIZE }; 
    arrlst *lstptr = &lst; 
    return lstptr; 
} 

void add(arrlst *lst, ARRTYPE elm) { 
    if (lst->size >= lst->nextincr) { 
     ARRTYPE *tmp = lst->arr; 
     lst->nextincr += INCR; 
     lst->arr = realloc(lst->arr, lst->nextincr); 

     for (int i = 0; i < sizeof tmp; i++) 
      lst->arr[i] = tmp[i]; 
    } 

    lst->arr[lst->size++] = elm; 
} 

ARRTYPE elmat(arrlst *lst, long at) { 
    if (lst->size < at) 
     strerror(14); 

    return lst->arr[at]; 
} 

我的問題是,每當我運行此,調用add()產生段錯誤,並且由於大多數add()代碼被跳過的第一次調用它,錯誤的線路必須是:

lst->arr[lst->size++] = elm; 

我不知道爲什麼這會segfault。請幫忙!

回答

2

因爲在nlst中你返回一個指向局部變量的指針,局部變量超出了作用域,當它們被定義的函數返回時,它們「死亡」。使用該指針將導致未定義的行爲,這是崩潰的一個非常常見的原因。

您有兩種解決方案:nlst應動態分配arrlst結構並返回該指針。或者你傳遞一個指向arrlst結構的指針,從而仿效通過引用。

+0

謝謝!我使用動態分配,它工作正常。 – Majora320