Если компилировать на старых компиляторах, то твоя программа может упасть на realloc. Вот описание
void * realloc (void *ptr, size_t newsize)
...............
If you pass a null pointer for ptr, realloc behaves just like malloc (newsize). This can be convenient, but beware that older implementations (before ISO C) may not support this behavior, and will probably crash when realloc is passed a null pointer.
Также наверно стоит проверить, что выделилась память.
1. Как сделать так что-бы прекращение ввода данных осуществлялось по вводу пустой строки а не 0.
Не сканируй сразу в число. Отсканируй ввод в строку. Проверь, Что она не пустая. А затем уже переводи в число.
2. Правильно ли работает функция sizeof определяющая размер введенного массива, и если нет то в чем ошибка ?
sizeof у тебя определяет длину в байтах типа int. Для 32 разрядных компов, будет всегда возрашаться значение 4.