Ho esaminato un po' il codice e ci ho trovato alcune cose che non vanno, principalmente nella funzione enqueue(): in quella funzione il puntatore "pointer" potrebbe venire modificato dalla realloc() interna, alla fine c'è infatti una return di quel puntatore ma nel main() non ne salvi l'eventuale valore nuovo... sostituisci quindi la chiamata a enqueue() in main() con:
codice:
pointer = enqueue(pointer, size);
(in realtà questa cosa si potrebbe risolvere molto più finemente passando a enqueue() un puntatore a puntatore ed eliminando il valore di ritorno, ma evito di farti invecchiare anzitempo).
Fatto questo, considera il ciclo for che fai all'interno della stessa funzione enqueue() (per inciso, perché ci sono due parentesi graffe all'esterno? Non hanno nessuna utilità...): direi di sostituire la condizione i>1 con i>=1, altrimenti nel caso in cui gli elementi fossero due non ci sarebbe lo "shift in avanti" che intendi fare con quel ciclo, questo perché i partirebbe da 1 (2-1) e tale valore risulterebbe fin da subito non maggiore di 1.
Infine, per un infame gioco di puntatori che mi risulta praticamente impossibile spiegare, direi di sostituire le operazioni di input di nome e cognome utilizzando buffer statici (diciamo di dimensione 30, se qualcuno ha un nome o un cognome più lungo si toglie dalle scatole
), altrimenti lasciando tutto così si crea la simpatica situazione per la quale alla fine tutti gli studenti si ritrovano con gli stessi nomi e cognomi (riducendo il discorso all'osso, questo succede perché copiando i puntatori alla fine ti ritrovi che tutti puntano alle stesse aree di memoria che hanno lo stesso contenuto). Tra l'altro, quell'operazione di input con una realloc() per ogni nuovo carattere forse eliminerà pure il problema dello spreco di memoria ma se si considera che per l'allocazione dinamica il processo fa una chiamata di sistema che mette in moto tutto un piccolo sistema solare, forse è meglio correre il rischio di sprecare qualche decina di byte.
Infine rimane valida anche l'osservazione di lolide: fai due volte lo stesso controllo sul puntatore.
Ti posto la versione modificata, se hai problemi fammi sapere. Ho eliminato la funzione swap() che non aveva alcuna utilità, nel caso reintroducila.
Va poi da sé che, avendo reso statici i campi nome e cognome, ho eliminato le varie free() richiamate su di essi.
codice:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
#include <stdbool.h>
#include <string.h>
#define MAX_LENGTH 30
typedef struct
{
char nome[MAX_LENGTH];
char cognome[MAX_LENGTH];
}studente;
void input (char []);
studente *enqueue (studente *pointer,int *size);
void check (void *pointer);
void print (studente *pointer, int *size);
int main(int agrc,char **agrv)
{
studente *pointer;
int *size,i;
pointer=(studente*)malloc(sizeof(studente));
size=(int*)malloc(sizeof(int));
*size=0;
for(i=0;i<5;i++)
{
pointer = enqueue(pointer,size);
}
print(pointer,size);
free(pointer);
return 0;
}
void input (char *string)
{
fgets(string, MAX_LENGTH, stdin);
string[strlen(string)-1] = '\0';
}
studente *enqueue (studente *pointer,int *size)
{
int i;
(*size)++;
if((*size)>1)
pointer=(studente*)realloc(pointer,(*size)*sizeof(studente));
check(pointer);
for(i=(*size-1);i>=1;i--)
{
pointer[i]=pointer[i-1];
}
printf("Inserisci nome:-->");
input(pointer[0].nome);
printf("Inserisci cognome:-->");
input(pointer[0].cognome);
return pointer;
}
void check (void *ptr)
{
if(ptr==NULL)
{
printf("Errore di allocazione della memoria.\n");
exit(0);
}
}
void print (studente *pointer, int *size)
{
int i;
for(i=0;i<(*size);i++)
{
printf("Studente %d\t Nome: %s\t Cognome: %s\n",i,pointer[i].nome,pointer[i].cognome);
}
}