script day.log

大学生がなんとなく始めた、趣味やら生活のことを記録していく。

*** glibc detected *** double free or corruption

無向グラフを作ることになり、はじめは大っきい配列を用意したらいいじゃん!
って考えていました。まあ当然無駄が多いので、動的に配列を確保したらイイよねって
結論になりまして、ゴリゴリしてたら、エラーが出たので、メモっているわけです。

問題のソースコードがこちら。

void makegraph(void)            /* グラフ作成 */
{
    int i, j;
  
    puts("頂点の数を入力してください");
    if (scanf("%d%*[^\n]", &n) != 1)
    {
        n = 0;  return;
    }

    //graphのメモリ動的確保
    int **graph;
    graph = malloc(sizeof(int *)* n);
    for(i=1;i<=n;i++){
        graph[i] = malloc(sizeof(int) * n-1);
    }
    //graphの初期化
    for(i=1;i<=n;i++){
        for(j=1;j<=n-1;j++){
            graph[i][j] = FALSE;
        }
    }

    puts("各辺の両端点を番号で入力してください");
    while (scanf("%d%d%*[^\n]", &i, &j) == 2)
    {
        graph[i][j] = TRUE;
        graph[j][i] = TRUE; 
    }

    puts("入力データ graph(i,j)=F/T");
    for (i = 1; i <= n; i++) {
        printf("%3d",i);
        for (j = 1; j <= i; j++) {
            if (graph[i][j])
                fputs("  T",stdout);
            else
                fputs("  F",stdout);
        }
        puts("");  
    }
    fputs("   ",stdout);
    for (i = 1; i <= n; i++) printf("%3d",i);
    puts("");

    //メモリの解放
    for (i=1;i<=n;i++) {
        free(graph[i]);
    }
    free(graph);
  
}

実行結果

頂点の数を入力してください
5
各辺の両端点を番号で入力してください
1 5
1 2
2 5
2 3
3 5
3 4
入力データ graph(i,j)=F/T
  1  F
  2  T  F
  3  F  T  F
  4  F  F  T  F
  5  T  T  T  F  F
     1  2  3  4  5
*** glibc detected *** ./a.out: double free or corruption (out): 0x0000000000991040 ***
…

原因はメモリの2重解放かな??
参考文献として、malloc(3)のメモリ管理構造 | VA Linux Systems Japan株式会社
を読んでいたのですが、難しい。

ぶっちゃけ、freeで解放せずプログラム終了したら、エラーメッセージなんて出ないんですよ…
malloc使ったらfreeで解放しないといけないのは、分かっているのです。

もう少し考えてみます…
正直、2次元配列の解放めんどくさいです。
C言語って難しい。