Как работает данный кусок кода на Си?
Вам бы всё-таки к книге обратиться, а не к данному ресурсу. 
Очищать память, если имеется ввиду освобождать, надо только после выделения памяти. Если ваша программа где-либо вызывает malloc и т.п., то нужно вызывать free, не иначе.
Динамические массивы и массивы большого размера лучше не выделять на стеке. Можно во время выполнения поймать переполнение стека. И при выделении массива помните, что память не бесконеча, и вам может ее не хватить. Опять же, если прочитать документацию, то realloc можете вызывать только после обязательного вызова malloc. Это все работа с аллокаторами, которые работают с динамической памятью.

Максимальный размер name. Name - это указатель, в котором хранится адрес, адрес на память. В нем не хранится ни размер, ни данные о том на что он указывает, ему без разницы, он всегда будет одного размера. В вашем случае, при компиляции в программе заранее выделяется память под все текстовые данные которые указаны у вас в коде, на них и указывает указатель. Если вы захотите сохранять введённые данные, то вам придется воспользоваться выделением памяти.
Похоже, вы решили пропустить пару-тройку глав по базовым понятиям языка и сразу рвануть к сути.
У вас создается строковый литерал "John", который размещается где-то  памяти, а потом вы 4 раза заталкиваете указатель на эту штуку в структуру, так что у вас по сути не 4 строки, а одна.

Вам нужно на каждой итерации вашего цикла делать malloc, чтобы выделить память под строку, а потом копировать туда строку при помощи strncpy или аналога.

Что касается необходимости применения realloc -вам он понадобится, если вы собираетесь реализовывать динамическое наращивание массива. И впредь не задавайте в одном топике больше одного вопроса.