Se hai dichiarato:
codice:
data **lista;
lista è un puntatore a puntatore a data, lista[i] è un puntatore a data.
Per cui quando fai:
codice:
lista[i]=(data*)malloc(sizeof(data));
Ti da segmentation fault se lista non ha alcun elemento allocato.
lista è un array di puntatori, ma è vuoto.Se i=0 puoi fare:
codice:
lista=(data**)malloc(sizeof(data*));
lista[0]=(data*)malloc(sizeof(data));
Cambiando l' argomento della malloc puoi anche avere più puntatori, ogni puntatore è un array.Se te in lista[0] ci allochi un solo elemento data è un "array" di un elemento, potresti anche allocarci 20 elementi, 30...
Ad esempio vuoi 10 array ciascuno da 20 elementi:
codice:
lista=(data**)malloc(10*sizeof(data*));
for(int i=0;i<10;i++)
    lista[i]=(data*)malloc(20*sizeof(data));