或者:重复Facing an error — glibc detected free invalid next size (fast)。
当我编译并运行此代码时,我收到一条错误消息: “realloc():下一个大小无效:0x0000000002483010”
我一直试图在过去的6个小时内找到解决方案而没有任何运气..
以下是我的代码的相关部分 -
#include<stdio.h>
#include<stdlib.h>
typedef struct vertex
{
char* name;
int id;
int outDegree;
}vertex;
int main(){
vertex *tmpVertice;
vertex *vertices = (vertex*)calloc(1, sizeof(vertex));
int p=1;
while(p<20){
vertex temp={"hi",p,0};
vertices[p-1]=temp;
tmpVertice=(vertex*)realloc(vertices,p);
if(tmpVertice!=NULL) vertices=tmpVertice;
p++;
}
return 0;
}
答案 0 :(得分:6)
realloc会释放任何先前的缓冲区,因此循环中的行free(vertices)
和free(tmpVertice)
是错误的,应该删除。
编辑:我在下面添加了您的程序的更新版本以及进一步修复。您需要realloc
p*sizeof(vertex)
而不是p
个字节。你正在编写超出数组末尾然后发展它。我已经在循环开始时更改为realloc
int main(){
vertex *tmpVertice;
vertex *vertices = NULL;
int p=1;
while(p<20){
vertex temp={"hi",p,0};
tmpVertice=realloc(vertices,p*sizeof(vertex));
if(tmpVertice==NULL) {
printf("ERROR: realloc failed\n");
return -1;
}
vertices=tmpVertice;
vertices[p-1]=temp;
p++;
}
return 0;
}
答案 1 :(得分:0)
在第一次迭代中,您将访问vertices[p-1] = vertices[2-1] = vertices[1]
,但您只分配1个字节(您只能访问顶点[0])。