2012-04-25 2 views
3

私はグラフを管理するためのいくつかの簡単な関数を書いています。sYSMALLOc:アサーションに失敗しました - どうすれば解決できますか?

私は私のプログラムを実行すると、以下のエラーが起こる:私はvalgrindの実行

malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) 
&((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) 
&& old_size == 0) || ((unsigned long) (old_size) >= (unsigned long) 
((((__builtin_offsetof (struct malloc_chunk, fd_nextsize)) 
+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) 
&& ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. 

、それは私にこのエラーを示しています

==5903== Memcheck, a memory error detector 
==5903== Invalid write of size 4 
==5903== at 0x8048866: creategraph 
==5903== by 0x8048718: readFile 
==5903== by 0x80486BF: main 
==5903== Address 0x41c3204 is 0 bytes after a block of size 4 alloc'd 
==5903== at 0x4027ABA: malloc (vg_replace_malloc.c:263) 
==5903== by 0x8048850: createGraph 
==5903== by 0x8048718: readFile 
==5903== by 0x80486BF: main 

これは私の構造体

typedef struct GRAPH { 
    int id; 
    int destination; 
    int cost; 
    struct GRAPH *next; 
    struct GRAPH *prev; 
} GRAPH; 

これです私の関数ですreadFile

void readFile() { 
    FILE *f = NULL; 
    char c; 
    f = fopen("g.txt", "r"); 
    if (f == NULL) { 
    puts("Error"); 
    } 
    int line = 0, column = 0; 
    g = createGraph(16); 
    while (!feof(f)) { 
    c = fgetc(f); 
    if (c == '\n') { 
     line++; 
    } else if (c == '1') { 
     createEdge(line, column, 1, g); 
     column++; 
    } 
    } 
    fclose(f); 
} 

これは私の関数createGraph

graph **creatgraph(int tV) { 
    int i; 
    graph **v; 
    v = (graph**) malloc(sizeof (graph*)); 
    if (v == NULL) { 
     puts("Error"); 
     exit(EXIT_FAILURE); 
    } 
    for (i = 0; i < tV; i++) { 
     v[i] = NULL; 
    } 
    return v; 
} 

である。これは、私の関数createVertex

graph *createVertex() { 
    graph *newVertex = NULL; 
    newVertex = (graph*) malloc(sizeof (graph)); 
    if (newVertex == NULL) { 
     puts("Error"); 
     exit(EXIT_FAILURE); 
    } 
    newVertex->id = 0; 
    newVertex->destination = 0; 
    newVertex->cost = 1; 
    newVertex->next = NULL; 
    novoVertice->prev = NULL; 
    return (newVertex); 
} 

これは

void createEdge(int vStart, int vFinal, int id, graph** g) { 
    graph *newVertex = createVertex(); 
    newVertex->destination = vFinal; 
    newVertex->id = id; 
    g[vFinal] = insertLast(g[vStart], newVertex); 
} 

はあなたの助けをありがとうございました、私の機能createEdgeです。

+0

今日も同様の問題がありました - http://stackoverflow.com/questions/10309113/assertion-in-malloc-c2453 –

答えて

5

あり、右ここでメモリ破壊のバグです:

v = (graph**) malloc(sizeof (graph*)); 
    ... 
    for (i = 0; i < tV; i++) { 
     v[i] = NULL; 
    } 

あなただけの1 graph*ポインタ用のストレージを割り当てているが、まだそれはtVなポインタのために十分な大きさであるかのように割り当てられたブロックを扱います。

malloc()呼び出していることに変更、修正方法:

v = (graph**) malloc(tV * sizeof (graph*)); 
+0

問題は解決しました。ありがとうございます。 –

1

はあなたが唯一の要素でポインタ配列を割り当てました。試してください:

graph **creatgraph(int tV) { 
    int i; 
    graph **v; 
    v = malloc(tV * sizeof *v); 
    if (v == NULL) { 
     puts("Error"); 
     exit(EXIT_FAILURE); 
    } 
    for (i = 0; i < tV; i++) { 
     v[i] = NULL; 
    } 
    return v; 
} 
+0

問題は解決しました、ありがとうございました。 –

1

このエラーは、どこかでメモリが壊れていることを意味します。 Valgrindでコードを実行して、プログラムがどこで失敗したかを調べます。

関連する問題