在struct中访问数组元素时出错

时间:2016-03-06 03:34:09

标签: c arrays pointers struct segmentation-fault

我试图写一个" 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;

而且我不知道为什么会出现这种错误。请帮忙!

1 个答案:

答案 0 :(得分:2)

因为在nlst中你返回一个指向局部变量的指针,并且局部变量超出了范围而且&#34;死了&#34;当他们定义的函数返回时。使用该指针将导致未定义的行为,这是崩溃的常见原因。

您有两个解决方案:nlst应该动态分配arrlst结构并返回该指针。或者您传入指向arrlst结构的指针,从而模拟按引用传递。