掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26641

動的確保した行列を解放する時にエラーが発生する
投稿者---h3X(2006/04/17 22:52:12)


環境はlinux(gcc)です。ちなみにglibcのバージョンはglibc-2.3.4-2.19です。

自作関数 make_matrix で m×n の行列を動的確保し、自作関数 free_matrix で、動的確保した行列を解放しようとするとエラーが出ます。
以下に自作関数と、実行結果を示します。

#include <stdio.h>
#include <stdlib.h>

double **make_matrix(int m, int n) {
    double **mat;
    int i;

    mat = (double **)malloc(sizeof(double *) * m);
    if (mat == NULL) {
        return NULL;
    }

    for (i = 0; i < n; i++) {
        mat[i] = malloc(sizeof(double) * n);
        if (mat[i] == NULL) {
            while (--i >= 0) {
                free(mat[i]);
            }
            free(mat);
            return NULL;
        }
    }
    return mat;
}

void free_matrix(double **mat, int m, int n) {
    
    if (mat == NULL) {
        return;
    }
    
    while (--m >= 0) {
        free(mat[m]);
    }
    
    free(mat);
}

int main(int argc, char *argv[]) {
    double **mat = NULL;

    mat = make_matrix(3, 4);
    free_matrix(mat, 3, 4); 
    
    return 0;
}


[実行結果]
$./a.out
*** glibc detected *** double free or corruption (out): 0x098a4018 ***
アボートしました
$


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:動的確保した行列を解放する時にエラーが発生する 26642 michi 2006/04/17 23:09:35


No.26642

Re:動的確保した行列を解放する時にエラーが発生する
投稿者---michi(2006/04/17 23:09:35)


m個しか確保してない配列をループでn回添え字指定してますよ


この投稿にコメントする

削除パスワード

No.26643

[*] 解決しました
投稿者---h3X(2006/04/17 23:25:20)


返信ありがとうございます。

>m個しか確保してない配列をループでn回添え字指定してますよ

今間違いにやっと気付きました。
make_matrix()関数のforループの所が間違ってました。


修正前:for (i = 0; i < n; i++) {
||
\/
修正後:for (i = 0; i < m; i++) {


ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧