1

コードを実行すると、ダブルフリーまたは破損エラーが発生します。基本的に、私はCで(任意のRxC次元の)行列を作成し、2つの行を交換し、結果を出力してから、メモリを解放しようとしています。行を入れ替えない場合、解放は完全に機能します。私がそうすると、それはクラッシュします。私はスワッピングが役に立たないように動作する方法を変更しようとしました。スコープ外のスワッピングの一時的なポインタと関係があると思いますが、これが問題なのか、どうすれば修正できるのかわかりません。

MatElementは単なるダブルです。

typedef double MatElement;

主要:

int main(int argc, char *argv[]) {

    MatElement** matrix = matrixAlloc(3,3);

    int i;
    int j;

    for(i = 0; i < 3; i++) {
        for(j = 0; j < 3; j++) {
            matrix[i][j] = i+j;
        }
    }
    matrixPrint(matrix, "%5.1f", 3, 3);
    swapRows(matrix, 0, 2);
    matrixPrint(matrix, "%5.1f", 3, 3);

    matrixFree(matrix);
    return 0;
}

行列の割り当て方法:

MatElement **matrixAlloc(int nr, int nc) {
    int i;
    MatElement *ptr;
    MatElement **A;

    A = malloc(nr * sizeof(MatElement *)); /* array of ptrs   */
    ptr = calloc(nr * nc, sizeof(MatElement)); /* matrix elements */
    for (i = 0; i < nr; i++) /* set row pointers properly */
        A[i] = ptr + nc * i;
    return A;
}

それらが解放される方法:

void matrixFree(MatElement **A) {
    free(A[0]);
    free(A);
}

行を入れ替える方法:

void swapRows(MatElement** G, int pivotRow, int rowExamined) {
    MatElement* temp;

    temp = G[rowExamined];
    G[rowExamined] = G[pivotRow];
    G[pivotRow] = temp;
}

このdoublefree()/ invalid free()の原因について誰かが知っていますか?

4

2 に答える 2

3

ある時点で、行列の最初の行を別の位置にスワップしているため、free(A[0])inmatrixFree()は、 によって返されたポインターではなく、配列の中央にポインターを解放しようとしていますcalloc()。元のポインターをどこかに保存して、邪魔されずに に渡すことができるようにする必要がありますfree()

于 2013-01-17T04:25:02.130 に答える
1

マトリックスは次のようになります。

A には、すべての行の最初の要素へのすべてのポインターがあります。したがって、最初は、A[0] は 0 番目の行を指し、A[1] は 1 番目の行などを指します。

したがって、行列を解放しようとすると、A[0] が最初の行を指していることがわかります。ただし、その時点では、行列要素が連続した位置にあり、A[0] は常に calloc によって返された初期ポインターを指していると想定しています。ただし、いくつかの行 (特に 0 番目の行と他の行のいずれかと) を交換すると、A[0] は calloc によって返されたポインターを指しません。

考えられる解決策には、次のように A にもう 1 つのメモリ スロットを割り当てることが含まれます。

A = malloc( ((nr+1) * sizeof(MatElement )); / ptrs の配列 */

calloc によって返された元のポインタを A[nr] に格納します。

したがって、A[nr] は calloc が返すポインターも指します。

于 2013-01-17T06:29:12.660 に答える