void container_row_change(struct brick_win_size *win, int character)
{
row_container *container = &(win->container[win->current_row]);
/*int offset = win->current_column;
char *data = win->container[win->current_row]. data;
if(offset < 0 || offset >= win->col)
offset = container->size;
data = realloc(data, win->container[win->current_row].size + 2 );
memmove(&data[offset + 1], &data[offset], (win->container[win->current_row].size - offset + 1));
data[offset] = character;
win->current_column++;
container->size ++;
*/
int offset = win->current_column;
if(offset < 0 || offset >= win->col)
offset = container->size;
win->container[win->current_row].data = realloc(win->container[win->current_row]. data, win->container[win->current_row]. size + 2);
memmove(&(win->container[win->current_row].data[offset + 1]), &(win->container[win->current_row].data[offset]), win->container[win->current_row].size - offset + 1);
win->container[win->current_row].data[offset] =character;
win->current_column++;
win->container[win->current_row].size ++;
}
谁能告诉我为什么注释的那行失败了,而另一行却没有,虽然两者是一样的?我想知道是否有任何错误的方式,我分配指针和重新分配它。
在注释出来的代码中,你重新分配了本地指针。data
而从不更新 .data
指针字段,因此它将继续指向旧的(现在已释放的)内存,当你试图使用它时,会导致损坏。
添加以下一行 win->container[win->current_row].data = data;
到注释出来的代码中,它实际上将等同于后面的代码。
请注意,无论哪种情况,如果重新分配失败,你都会崩溃--你应该检查失败,并做一些适当的事情(可能是打印一个错误信息,并尝试优雅地退出)。