2

或者:Facing an error — glibc detected free invalid next size (fast) 的副本。

当我编译并运行此代码时,我收到一条错误消息:“realloc(): invalid next size: 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;
}
4

2 回答 2

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;
}
于 2012-12-21T18:39:06.920 回答
0

在第一次迭代中,您将访问vertices[p-1] = vertices[2-1] = vertices[1],但您仅分配 1 个字节(您只能访问 vertices[0])。

于 2012-12-21T18:38:34.043 回答