I primi problemi che avevo riguardavano proprio l'indice size-1 perché non avevo proprio capito che rappresentasse l'ultima cifra dell'array quindi , per come volevo fare io, per terminare con -2 ftp dovevo solo modificare il ciclo while

L'altra domanda riguarda l'utilizzo di malloc e realloc .. Non ho chiara la differenza e non capisco perché in questo esercizio non avrei potuto usare malloc ..? Per cercare di capire meglio l'utilizzo di realloc ho fatto un altro esercizio, con output uguale a quello precedente ma ho capito ancora meno

codice:
#include <stdio.h>
 #include <stdlib.h> 
 int main () {   
int val,i; 
  int size=0;   
int * v = NULL;   
int * more_numbers;  
  do {    
  printf (" digita un numero intero  (0 per terminare: ");     
 scanf ("%d", &val);    
  size++;     
  more_numbers = (int*) realloc (v, size * sizeof(int));    
   if (more_numbers!=NULL) {       
 v=more_numbers;        
v[size-1]=val;      }     
 else {        
free (v);        
puts ("Errore (ri)allocazione della memoria");       
 exit (1);      }   }
 while (val!=0);    
printf ("Numeri digitati: ");   
for (i=0;i<size;i++) 
printf ("%d ",v[i]);   
free (v);    
return 0; }