Ну, поехали.
int *ptr0, *ptr1;
Обьявили два указателя на int. Поскольку переменные на куче, там может быть все, что угодно.
printf("%d %d\n",ptr0,ptr1);
Указатели так не печатают. Ты получишь бессмысленное число, которое не использовать нигде. Обычно указатели печатают так:
printf("%0X %0X\n", ptr0, ptr1);
*ptr0= 21;
Дальше этого оператора программа работать не будет - в этом месте в 99% возникнет прерывание защиты памяти - то есть попытка обращения к области памяти, которая не принадлежит программе. При этом как правило возникает SIGSEGV и все. Если программа выполняется в однозадачной среде, где нет защиты памяти - такой оператор приведет к зависанию, поскольку в нижних адресах обычно расположены системные таблицы.