Errore durante l’accesso all’elemento della matrice in struct

Sto cercando di scrivere un programma “ArrayList” (simile a Java ArrayList ) che si espanderà automaticamente usando realloc , in modo che il programmatore non debba preoccuparsi dello spazio di archiviazione negli array. Questo è il mio codice:

 #include  #include  #include  #include  #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 arr[i] = tmp[i]; } lst->arr[lst->size++] = elm; } ARRTYPE elmat(arrlst *lst, long at) { if (lst->size arr[at]; } 

Il mio problema è che ogni volta che eseguo questo, chiamando add() produce un segfault, e poiché la maggior parte del codice in add() viene saltata alla prima chiamata, la riga di errore deve essere:

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

E non so perché questo sarebbe segfault. Per favore aiuto!

Perché in nlst si restituisce un puntatore a una variabile locale e le variabili locali escono dall’ambito e “muoiono” quando la funzione sono definite nei ritorni. L’uso di quel puntatore porterà a un comportamento indefinito , che è una ragione molto comune per i crash.

Avete due soluzioni: o nlst dovrebbe allocare dynamicmente la struttura arrlst e restituire quel puntatore. Oppure si passa a un puntatore a una struttura prima, emulando quindi il passaggio per riferimento.