2

メモリ割り当てで修正できないように見える問題があります。

malloc を使用して 3 つの動的に割り当てられた配列 (ipiv、k、b) を作成しましたが、それらを解放しようとすると、セグ フォールトが発生します。それらを解放しなければ、コードは正常に機能します (ただし、繰り返しを実行しすぎると、メモリが不足します)。

これがコードです...コードがかなり長いので、3つの配列を使用しない部分をすべて取り出しました。

#include<stdio.h>
#include <string.h>
#include<stdlib.h>
#include<math.h>
#include <mpi.h>
#include "mkl.h"

#define K(i,j) k[(i)+(j)*(n)]

void dgesv_( const MKL_INT* n, const MKL_INT* nrhs, double* a,
            const MKL_INT* lda, MKL_INT* ipiv, double* b, 
            const MKL_INT* ldb, MKL_INT* info );

int main()
{
    int *ipiv=malloc(n*sizeof(int));
    for (i=0; i<n; i++) {
        ipiv[i]=0;
    }

    for (globloop=0; globloop<=lasti; globloop++) {

        double a[ndofs];
        double rhs[ndofs];
        double F[ndofs];

        double *k=malloc(n*n*sizeof(double));


        //var for stiffness matrix (this is the one acutally fed to dgesv) 
            //see define at top
        for (i=0; i<n; i++) {
            for (j=0; j<n; j++) {
                K(i,j)=0.0;
            }
        }   

            //bunch of stuff modified, a,rhs,and F filled... ect

        while (sos>=ep && nonlinloop<=maxit) {

            double KFull[ndofs][ndofs];
            for (i=0; i<ndofs; i++) {
                for (j=0; j<ndofs; j++) {
                    KFull[i][j]=0.0;
                }
            }

                    //KFull filled with values..

            //trim the arrays to account for bcs 
            double *b=malloc(n*sizeof(double));
            for (i=0; i<n; i++) {
                b[i]=rhs[i+2];
            }

            //k array filled
                    //see define above
            for (i=0; i<n; i++) {
                for (j=0; j<ndofs-2; j++) {
                    K(i,j)=KFull[i+2][j+2];
                }
            }

            //SOLVER
            dgesv_(&n,&one,k,&n,ipiv,b,&n,&info);

            //now we must take our solution in b, and place back into rhs
            for (i=0; i<n; i++) {
                rhs[i+2]=b[i];
            }
            nonlinloop++;
            free(b);
        }
        free(k);
    }
    free(ipiv);
    return 0;
}

これら 3 つの変数のいずれかを解放すると、セグメンテーション違反が発生します。私はこれについて非常に混乱しています。

4

1 に答える 1

1

もしn=ndofs-4(OP のコメントで述べたように) thenndofs-2 がより大きい nなら. そして、コードはメモリを破損します

K(i,j)=KFull[i+2][j+2];

jまで実行されndofs-2-1、 でKあると (のみ) 定義されているためですK[0..n-1][0..n-1]

于 2012-11-29T19:37:49.193 に答える