Mex功能在完成时崩溃

时间:2012-11-04 23:18:00

标签: matlab segmentation-fault mex

我这里有一个C mex文件可以正常执行,但是在完成执行后会使用段错误导致MATLAB崩溃。由于它在程序执行完毕后崩溃,因此我认为MATLAB自动释放已分配的内存会导致问题。但是,我释放自己动态分配的变量,不要尝试释放mxArray结构。请看看你是否可以帮我确定导致MATLAB崩溃的原因。

#include <mex.h>
#include <matrix.h>
#include <stdio.h>

void mexFunction(
int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{ 
    /* Declare variables. */
    int i ,j, numdims, *ipos, count;
    const mwSize *dim_array;
    mwSize size;
    double *pos, rad;

    /* Ingest inputs. */
    numdims = mxGetNumberOfDimensions(prhs[0]);
    dim_array = mxGetDimensions(prhs[0]);
    rad = mxGetScalar(prhs[1]);
    pos = mxGetData(prhs[0]);
    size = dim_array[0]*dim_array[1];

    ipos = (int*) mxMalloc(size);
    for (i = 0; i < size; i++)
        ipos[i] = (int) (pos[i]*rad);
    count = 0;
    for (i = 0; i < size; i+=2)
        for (j = i + 2; j < size; j+=2)
            if (ipos[i] == ipos[j])
                if (ipos[i+1] == ipos[j+1])
                    count++;
    mxFree(ipos);

    /* Generate output */
    plhs[0] = mxCreateDoubleScalar(count);
    printf("\nProgram finished executing!\n");
}

提前感谢您的帮助!

编辑:我还应该注意,程序的输入是(按顺序)2 x n矩阵和标量,其中n可以是任何正整数。实际程序正确检查尺寸,但我没有在这里包含这些行来保存代码空间。

2 个答案:

答案 0 :(得分:2)

UPD。你是对的 - 当矩阵变大时,它会崩溃:)

所以我想我有个主意:

尝试更改两行代码

plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
mxGetPr(plhs[0])[0] = (double) count;

换新单行

plhs[0] = mxCreateDoubleScalar(count);

在我完成之后它不再崩溃。

答案 1 :(得分:1)

在用动态内存分配编写了几百个C程序之后,我有点惭愧地说错误就是这样:

替换

    ipos = (int*) mxMalloc(size);

    ipos = (int*) mxMalloc(size*sizeof(int));

似乎总是最愚蠢的错误逃避了我。我要感谢所有可能花了一两分钟看这篇文章的人。