4

我在这里有一个可以正确执行的 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 xn 矩阵和一个标量,其中 n 可以是任何正整数。实际的程序会正确检查尺寸,但我没有在此处包含这些行以节省代码空间。

4

2 回答 2

2

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

所以我想我有一个想法:

尝试更改您的两行代码

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

对于新的单行

plhs[0] = mxCreateDoubleScalar(count);

完成后它不再崩溃。

于 2012-11-04T23:41:57.550 回答
1

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

代替

    ipos = (int*) mxMalloc(size);

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

似乎总是最愚蠢的错误在逃避我。我要感谢所有可能花一两分钟时间看帖子的人。

于 2012-11-08T18:18:39.900 回答