在 MATLAB 中使用 MEX-C 函数的分段错误

Segmentation Fault using MEX-C function in MATLAB

我在 MATLAB 中创建 MEX-C 函数时遇到了问题运行。

事情是这样的,我想 return 我的计算例程生成的一些数据并将其放入 plhs[0]。

我想我对使用 C 指针和 MEX 文件有误解,因为我不是真正的 C 人...

这是我的代码:

void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{
    uint8_t *output_buffer;
    mwSize *size;
    size = (mwSize *) mxGetPr(prhs[0]);
    plhs[0] = mxCreateNumericMatrix(1, size[0], mxUINT8_CLASS, mxREAL);
    output_buffer = (uint8_t *) mxGetData(plhs[0]);
    output_buffer = genData();
}

基本上我的函数 genData() 正在生成一些数据并 returns 它。

我希望在输入时得到结果作为输出:

a = genData() a 将包含 plhs[0] 内容,但这不起作用。

我试过使用 mxSetData(plhs[0], output_buffer) 。它可以工作,但在做其他事情时会崩溃...

我认为答案应该很明显,但我不是 C 语言的专家。

感谢您的帮助。

您不能通过 mxSetData(和朋友)API 函数将本机 C/C++ 内存附加到 mxArray。这会搞砸 MATLAB 内存管理器并最终导致崩溃。您必须更改 genData 函数以使用 MATLAB API 函数进行内存分配(mxMalloc、mxCalloc 等),在这种情况下您可以使用 mxSetData,或者您需要从返回的 genData 复制数据指向 mxArray 的指针。 此外,您获取 size 变量的方法并不可靠。如果 prhs[0] 中存储的整数类型与 mwSize 不匹配,那么您将得到错误答案或崩溃。所以而不是这个

mwSize *size;
size = (mwSize *) mxGetPr(prhs[0]);
plhs[0] = mxCreateNumericMatrix(1, size[0], mxUINT8_CLASS, mxREAL);

你应该这样做

mwSize size;
size = mxGetScalar(prhs[0]);
plhs[0] = mxCreateNumericMatrix(1, size, mxUINT8_CLASS, mxREAL);

最后,您应该预先进行一些检查,以确保有一个 prhs[0] 被传入,它是数字,并且它不为空且不复杂,等等。 顺便说一句,以下行 dos not 将指针附加到 mxArray:

output_buffer = genData();

它只是覆盖了 output_buffer 变量中的值……没有别的。