La méthode consistant a réallouer un nouveau tableau, puis si ça réussi à recopier l'ancien, demande d'utiliser malloc et non pas realloc.
realloc va vraiment réallouer le tableau. C'est-à-dire que s'il y a assez de place après, il ne le bouge pas et réserve juste la place qu'il faut, et s'il n'y a pas assez de place alors il en alloue un nouveau et recopie lui même les anciennes données.
Dans ce cas là, tu vérifie que realloc ne renvoie pas NULL pour savoir s'il a réussi (sinon, l'ancien tableau n'est pas touché), mais de toute manière, que peut tu faire d'autre dans ce cas là que de planter lamentablement (et en plus, ça ne se produira pas).
Par contre, c'est une très mauvaise méthode de procéder car tu passe ton temps (possiblement) à recopier ton tableau ce qui fait d'immense perte de temps.
Il est beaucoup plus efficace d'allouer d'abord la mémoire pour 10 lignes, par exemples, et si ça ne suffit pas pour 10 nouvelles lignes, puis pour 20 lignes, pour 40, etc. En doublant la taille de ton tableau à chaque fois, si tu ne peut pas connaitre dès le début la mémoire dont tu auras besoin.
Par contre, oublie directement le code de final-heart, c'est du n'importe quoi ("l'allocation" de Hligne à la fin particulièrement).