我试图写一个" 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;
而且我不知道为什么会出现这种错误。请帮忙!
答案 0 :(得分:2)
因为在nlst
中你返回一个指向局部变量的指针,并且局部变量超出了范围而且&#34;死了&#34;当他们定义的函数返回时。使用该指针将导致未定义的行为,这是崩溃的常见原因。
您有两个解决方案:nlst
应该动态分配arrlst
结构并返回该指针。或者您传入指向arrlst
结构的指针,从而模拟按引用传递。