0

我正在尝试用 C++ 构建一个与矩阵和矩阵函数一起工作的程序。我的代码编译正常,但是当我尝试执行它时,我得到了消息:

分段错误(核心转储)

我的代码有很多看起来像这样的功能:

void function(double **matrix, ...) {
    //Operations with the matrix
}

我这样调用函数:

double **M;
function(M,...);

通过研究该消息,我发现我需要动态分配要使用的矩阵,因此编写了以下应该执行此分配的函数:

void allocMatrix(double **M, int nl, int nc) {
M = new double*[nl];
for(int i = 0; i < nl; ++i)
        M[i] = new double[nc];
}

void freeMatrix(double **M, int nl) {
for(int i = 0; i < nl; ++i)
         delete [] M[i];
delete [] M;
}

现在使用这些函数,我尝试调用我的其他函数执行以下操作:

double **M;
allocMatrix(M, numberOfLines, numberOfColumns);
function(M,...);
freeMatrix(M, numberOfLines);

但是,即使进行了此更改,我仍然收到消息“分段错误(核心转储)”。

我什至尝试在这样的函数中分配矩阵:

void function(double **matrix, ...) {
    allocMatrix(M, numberOfLines, numberOfColumns);
    //Operations with the matrix
    freeMatrix(M, numberOfLines);
}

但它也没有奏效。

有谁知道我哪里不对?

4

3 回答 3

2

您当前正在传递Mto的副本allocMatrix。当函数返回时,您在此处分配的内存会泄漏。M如果要修改调用者的变量,则需要传递一个指针

double **M;
allocMatrix(&M, numberOfLines, numberOfColumns);
function(M,...);
freeMatrix(M, numberOfLines);

void allocMatrix(double ***M, int nl, int nc) {
    *M = new double*[nl];
    for(int i = 0; i < nl; ++i)
            (*M)[i] = new double[nc];
}
于 2013-06-10T21:31:56.187 回答
2

您需要在调用中传入double ***参数列表并发送&M(的地址M)。没有它,你M就没有矩阵,你会在不同的函数中得到段错误。

于 2013-06-10T21:34:39.517 回答
1

既然您正在编写 C++,为什么不使用vector?

#include <vector>

int main()
{
    // This does what your "allocMatrix" does.
    std::vector< std::vector<double> > M(numberOfLines, numberOfColumns);

    // Look Ma!  No need for a "freeMatrix"!
}
于 2013-06-10T22:09:00.760 回答