【问题标题】:realloc returning NULL while shrinking dynamic arrayrealloc 在缩小动态数组时返回 NULL
【发布时间】:2021-05-17 21:56:40
【问题描述】:

函数nodeOutputDel 用于删除output[] 元素之一,方法是用最后一个元素替换它并用realloc 缩小数组,但realloc 返回NULL,程序以errorlevel 11 退出。

struct Node
{
    unsigned int *input;
    unsigned int *output;
    unsigned int  inputCount;
    unsigned int  outputCount;
    unsigned int  id;
    bool          state;
};

void nodeOutputDel(struct Node *node, unsigned int id)
{
    unsigned int *newMem, i;
    
    for(i = 0; i < node->outputCount; i++)
    {
        if(node->output[i] == id)
        {
            node->output[i] = node->output[node->outputCount - 1];
            node->outputCount--;
            newMem = realloc(node->output, node->outputCount * sizeof(id));
            if(newMem == NULL) exit(11);
            node->output = newMem;
        }
    }
}

为什么这不起作用?我当然没有用完内存。

编辑:谢谢,我忘记了当最后一个元素消失时realloc 返回NULL

【问题讨论】:

  • 请提供完整的代码minimal verifiable example。特别是我们需要看看node-&gt;output最初是如何设置的,outputCount是否总是一个有效的值。
  • 减量后是node-&gt;outputCount==0吗? “NULL 也可以通过成功调用 realloc() 来返回,大小为零。”
  • 这能回答你的问题吗? Realloc returning NULL
  • 顺便说一句,您的代码对我来说没有多大意义。在 each 迭代而不是在所有迭代完成之后调整 node-&gt;output 的大小似乎是不合适的。此外,当您移动数组中的元素时,这意味着循环的下一次迭代将跳过您移动到ith 位置的元素。如果您保证最多有一个节点将匹配给定的id,那么您应该在找到匹配项后break
  • @jamesdlin 输出数组仅包含唯一值。是的,比赛结束后应该是return。谢谢。

标签: c dynamic-arrays realloc


【解决方案1】:

看起来您正在从数组中删除一项,但您需要将所有内容移到数组中该元素的右侧,向左移动一个元素。使用 memmove 为您完成繁重的工作。

例如,如果您的节点->输出数组是[11,22,33,44],并且您想从中删除22,您想将该数组的大小调整为[11,33,44]

而不是这个:

    if(node->output[i] == id)
    {
        node->output[i] = node->output[node->outputCount - 1];
        node->outputCount--;
        newMem = realloc(node->output, node->outputCount * sizeof(id));
        if(newMem == NULL) exit(11);
        node->output = newMem;
    }

这个:

    if(node->output[i] == id)
    {
        // shift all the nodes to right of node->output[i] one slot to the left

        unsigned int shift = node->outputCount - i - 1;
        
        if (shift > 0)
        {
            memmove(node->output+i, (node->output)+(i+1), shift*sizeof(id));
        }
        node->outputCount--;

        if (node->outputCount == 0)
        {
           free(node->output);
           node->output = NULL;
        }
        else
        {
            node->output = realloc(node->output, node->outputCount * sizeof(id));
        }
    }
       

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 2017-06-05
    • 2011-06-14
    • 1970-01-01
    • 2013-11-29
    • 2016-02-28
    • 2016-09-20
    • 2012-12-06
    • 1970-01-01
    相关资源
    最近更新 更多