我这里有一个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可以是任何正整数。实际程序正确检查尺寸,但我没有在这里包含这些行来保存代码空间。
答案 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));
似乎总是最愚蠢的错误逃避了我。我要感谢所有可能花了一两分钟看这篇文章的人。