Moving the cursor to another column shouldn't activate any need for realloc() - you're just updating the cursor (caret) position of the currently-edited-line.
When the user moves the caret to another line, that's when you realloc() (once) the just-edited-line and fix the linked list (obviously, you do this only if it was changed). Then, just clear the currently-edited-line and assign it the data from whatever row the caret is now on. So, just one realloc().
The only time you would need to realloc() the currently-edited-line buffer is if it grew larger than you had initially allocated. If you figure a line might typically be 80 chars, and you allocate 256 (for example), you won't be reallocing it very much. No big deal if you do, and completely transparent to the user.