C:在结构数组上使用malloc和realloc时出错



我正在尝试为图上的算法动态分配内存。这是我的代码分解到问题:

typedef struct
{
int id;
int color;
} node_t;
unsigned int max_n = 2;
node_t* node_malloc = malloc(sizeof(node_t) * max_n);
node_t* nodes = node_malloc;
if(atoi(left_node) > max_n)
{
max_n = (size_t) atoi(left_node);
nodes = realloc(nodes, sizeof(node_t) * max_n);
}

对于max_n<9,realloc起作用-当max_n为9或更大时;free((:无效指针:"被抛出。

free(node_malloc);

当在发生realloc之后调用free(node_malloc(时;free((:无效的下一个大小(fast(">

谢谢你的回答!

发生的情况是,在realloc调用之后,nodes_malloc中的指针值不再有效。如果realloc无法扩展当前缓冲区,它将为新的缓冲区分配空间,将旧缓冲区的内容复制到其中,然后释放旧缓冲区,这显然是当您扩展超过9个元素时会发生的情况。

使用nodes作为realloc调用的临时目标-如果不是NULL(意味着realloc成功(,则将其分配回nodes_malloc:

nodes = realloc( nodes_malloc, sizeof *nodes * max_n );
if ( nodes )
{
nodes_malloc = nodes;
}
else
{
// realloc failed
}

你有这个:

node_t* node_malloc = malloc(sizeof(node_t) * max_n);
node_t* nodes = node_malloc;

之后,指针node_mallocnodes都指向同一存储器。

但在第一次呼叫realloc之后,就不再保证了。事实上,几乎可以肯定的是,nodes将指向其他地方,而node_malloc指针将无效。

尝试free(node_malloc)将导致未定义的行为


在相关问题上,永远不应该将指针分配回传递给realloc的指针。如果realloc失败,它将返回NULL,但旧的内存分配将保持有效。如果重新分配回同一个指针,则会丢失原始内存并导致内存泄漏。始终使用临时变量,并检查是否存在故障(NULL(。

相关内容

  • 没有找到相关文章

最新更新