Вы должны выделить только один раз.В данный момент вы создаете утечку памяти каждый раз, когда вызываете функцию push.Никто не обращается к памяти, как только вы выходите из функции.Вы можете сделать это статичным, чтобы сохранить информацию.Имейте в виду, что вы также ограничиваете количество значений, которое вы можете хранить на уровне 10.
void push(int p)
{
static int i=0;
static int *ptr =(int *)malloc((10)*sizeof(int)); // To keep the values
int b;
ptr[i]=p;
for(b=0;b<=i;b++){
printf("%d",ptr[b]);
printf("\n");
}
i++;
if( i >= 10 ) i = 0; // To make sure there is no overflow
}
А еще лучше, если вы можете указать место, где вы хотите сохранить информацию.