0
int Add_Edge_To_Vertex(int vertexFromId,int vertexToId){
    vertex vertexTo=vertices[vertexToId];
    if(vertexTo.edgesInArrLength == vertexTo.numOfEdgesIn){ //multiply this vertex arr of edges if needed
        vertices[vertexToId].edgesInArrLength = (vertices[vertexToId].edgesInArrLength)*2;
        tmpVertexEdges = (edge*)realloc((vertices[vertexToId].edges),(vertices[vertexToId].edgesInArrLength)*sizeof(edge));
        if(tmpVertexEdges != NULL) {
            vertices[vertexToId].edges = tmpVertexEdges;
        }
        else
        {
            free(tmpVertexEdges);
            return 0;
        }
    }
}

typedef struct vertex
{
    char* name; //not unique
    int id; //unique
    edge* edges; //array  edges
    int outDegree;
    int edgesInArrLength;
    int numOfEdgesIn;
    double rank;
}vertex;

これが頂点を初期化する方法です-

vertex res={(char *)malloc(strlen(name)*sizeof(char)),verticesCount,(edge*)calloc(1, sizeof(edge)),0,1,0,1};

エッジがこの構造体の場合-

typedef struct edge
{
    int fromVertexId;
    int toVertexId;
    double weight;
}edge;

vertex.edges 配列を 2 倍にしようとすると (3 ~ 12 行目)、realloc 部分でプログラムがクラッシュし、次のエラー メッセージが表示 されます - * glibc が検出されました/home/froike/workspaceC/Page Ranking/Debug/Page Ranking: malloc(): メモリ破損: 0x00000000009711d0 * *

4

1 に答える 1

1

edgesポインターを初期化していないstruct vertexので、realloc呼び出しが無効なポインターを再割り当てしようとしていると思いますか? しかし、あなたが私たちにすべてのコードを教えてくれたわけではないので、確信が持てません。

于 2013-03-26T08:52:36.097 に答える