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