将评论转移到答案中,因为没有其他人参与进来。
为什么不使用(双向链接)字符串列表,其中列表中的每个项目都是一行,因此您可以printw()
像使用数组一样每行调用一次?您还将大大减少存储需求;在 64 位机器上,单个字符的双向链表可能每个字符使用 24 个字节,这是相当高的开销。
我实际上才开始这样做。这似乎是一个相当不错的妥协(我有一种预感,那就是 nano 使用的东西)。我可能会删除这个问题,因为我认为这是我将使用的解决方案。realloc()
此外,在每次插入/移除时使用是不是一个坏主意?
我可能会按照以下方式设计列表节点:
struct Line
{
struct Line *next;
struct Line *prev;
char *line;
size_t line_len;
size_t line_max;
};
line_len
记录当前行长度,并记录line_max
分配的空间。
realloc()
当角色被删除时,我不会打电话;除非实际大小和最大大小之间存在相当大的(256 字节?)差异,否则我可能不会这样做。
对于插入,我只会在不再有空间时重新分配(当line_len == line_max
,但要小心一个一个),并且我会以至少 16 个字符的增量分配(因为这可能是malloc()
et al 实际分配的最小数量, 加上当用户插入一个字符时,他们通常会插入几个)。因此,您希望避免每个字符更改内存分配(调用realloc()
),而不必害怕在必要时重新分配。