2016-03-06 77 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