Patrząc na kod wyszło mi, że wypisuje się dobrze, a problemem jest raczej to jak testujesz. Tj. na oko testujesz to tak:
a
s
d
f
.
Czyli znaki które podajesz to: 'a', znak nowej linii, 's', znak nowej linii, 'd', znak nowej linii, 'f', znak nowej linii, kropka. Więc ostatecznie tablica znaków ma 8 znaków, które, jak wypisujesz, dają:
a
s
d
f
Co jest poprawnym wynikiem.
Spróbuj to przetestować tak:
asdf.
I zobacz co wtedy Ci wyjdzie.
A btw, i poczytaj o funkcji realloc, bardzo by uprościła Ci życie. I pewnie o null-byte też - jak byś go używał, to ostateczne wypisanie sprowadziło by się do puts(tab) zamiast pętli ;)