0

我正在使用多维数组,但我遇到了一个异常,我搜索了很多,但我找到了我正在使用的相同答案,当我尝试分配 matriz[i] = new double[n] 时异常跳转。我已经尝试了评论和未评论的解决方案,但没有运气。

void interpol(double *arr_x, double *arr_y, int n, double *results) {
    //double** matriz = new double*[n];
    double** matriz;
    matriz = (double**) malloc(n * sizeof(double*));
    for(int i = 0; i < n; i++){    
        //matriz[i] = new double[n+1];
        matriz[i] = (double*) malloc(n+1 * sizeof(double));
        for(int j = 0; j < n; j++) {
            matriz[i][j] = pow(arr_x[i],j);
        }
        matriz[i][n] = arr_y[i];
    }
    gaussiana(matriz, n, results);
}

- - 编辑 - -

功能 gaussiana 工作正常,因为我已经在这个功能之外进行了测试。异常被抛出: //matriz[i] = new double[n]; matriz[i] = (double*) malloc(n * sizeof(double));

n 永远不会超过 10。

抛出的异常是:

Interpolacion.exe 中 0x00071c4d 处的第一次机会异常:0xC0000005:访问冲突读取位置 0x00000000。Interpolacion.exe 中 0x774b15de 处未处理的异常:0xC0000005:访问冲突读取位置 0x00000000。程序“[8012] Interpolacion.exe: Native”已退出,代码为 -1073741819 (0xc0000005)。

---- EDIT---- 我终于让它工作了,问题不在matriz中,而是在arr_x/arr_y中,外部例程发送数据错误(奇怪的是错误和堆栈跟踪总是将我引向新的double [n] 分配)

4

2 回答 2

1

如果您想使用该std::vector路线,您可以使用如下所示的内容(未经测试,仅供参考)。请记住,std::vector<std::vector<double> >它与 不兼容double **,因此您的gaussiana函数可能需要重写以接受新类型。:

// Include the header!
#include <vector>


// Be careful about the use of "using namespace std", I'm only using it here
// because it's a small example
using namespace std;

vector<vector<double> > matriz;

for (int i = 0; i < n; i++)
{
    // Create a new vector "v" with n+1 elements
    vector<double> v(n + 1);

    // fill this vector
    for (int j = 0; j < n; j++)
        v[j] = pow(arr_x[i], j);
    v[n] = arr_y[i];   

    // add it to the matrix
    matriz.push_back(v);
}
于 2012-04-12T06:57:19.590 回答
0

我在代码中看不到任何会导致异常的内容。一定是gaussiana()惹了麻烦。尝试注释掉该行,看看程序是否仍然出错。

知道 的范围会很有用n。只要它在现代 32 位或 64 位机器上相对较小(< 1000),就malloc()不会失败。但是,如果程序在内存受限的情况下运行,或者n程序很大,则很可能某些mallocs 会失败。由于没有检查是否返回 NULL,因此程序在尝试取消引用指针时会通过 SEGFAULTing 指示出现问题。

如果多次调用该函数,内存泄漏可能会导致严重的堆短缺并导致malloc()失败。

于 2012-04-12T06:14:02.810 回答