两个指针指向同一个内存,重估失败。

问题描述 投票:0回答:1
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 ++;

}

谁能告诉我为什么注释的那行失败了,而另一行却没有,虽然两者是一样的?我想知道是否有任何错误的方式,我分配指针和重新分配它。

pointers realloc
1个回答
1
投票

在注释出来的代码中,你重新分配了本地指针。data 而从不更新 .data 指针字段,因此它将继续指向旧的(现在已释放的)内存,当你试图使用它时,会导致损坏。

添加以下一行 win->container[win->current_row].data = data; 到注释出来的代码中,它实际上将等同于后面的代码。

请注意,无论哪种情况,如果重新分配失败,你都会崩溃--你应该检查失败,并做一些适当的事情(可能是打印一个错误信息,并尝试优雅地退出)。

© www.soinside.com 2019 - 2024. All rights reserved.