Certo che il problema sparisce, ma se tu utilizzassi un vettore predefinito (cioè dichiarassi una dimensione fissa per il vettore) sarebbe inutile utilizzare una malloc con parametri (vedi sopra).
Questo è un trucchetto per poter utilizzare un vettore senza sprecare memoria e senza ricorrere all'uso di liste o alberi.

Pensa se devi utilizzare un vettore di vettori, cioè in cui ogni posizione è un vettore (che chiameremo vett_int), tu sai a priori che la dimensione massima dio vett_int è di 300 posizioni (quindi bisognerebbe scrivere nella struttura ... int vett_int[300]; ) ma ad ogni posizione (del vettore esterno) utilizzerai un numero diverso ... se tale numero fosse compreso tra 0 e 5 ci sarebbe un po' dispreco...

Ritornando al problema originale...
credo che una possibile soluzione al problema potrebbe consistere nel dichiarare un "vettore fittizio" di double:

double weight_tran[1]

e un puntatore di interi

int *items, allocando poi il numero esatto di interi (grazie a i o n).

Di conseguenza dovrebbe anche cambiare la dichiarazione della variabile tat: dovrebbe esser aggiunta la dichiarazione di spazio allocato per il vettore di double.

Vi ringrazio comunque dell'interessamento...