“realloc():下一个大小无效”

时间:2012-12-21 18:37:24

标签: c

或者:重复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;
}

2 个答案:

答案 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])。