C 结构中的分段错误。使用 Matlab Coder 从 Matlab->C 翻译的代码

C Segmentation fault in struct. Code translated from Matlab->C with Matlab Coder

本文关键字:Matlab- gt 代码 翻译 Matlab 结构 分段 错误 使用 Coder      更新时间:2023-10-16

我正在用Matlab编码器将一些Matlab函数翻译成C。一切都进行到我想要从函数返回一个数组(转置向量)的地步。

在Matlab中,我有一个函数:

function returnedArray = myFun(input arguments)
<function code>

对C中函数的调用将translatet转换为:

void myFun(input arguments, emxArray_realT *returnedArray)
<function code>

emxArray_real_T是一个结构,由Matlab编码器生成:

struct emxArray_real_T
{
    real_T *data;
    int32_T *size;
    int32_T allocatedSize;
    int32_T numDimensions;
    boolean_T canFreeData;
};

而real_T,int32_T。。。创建了通用类型定义:

typedef double real_T;

我称之为myFun从主要:

struct emxArray_real_T *result = malloc(sizeof(struct emxArray_real_T));
myFun(input arguments, result);

当我运行这个程序时,我会得到一个错误:Segmentation fault。gdb给了我这个:

Program received signal SIGSEGV, Segmentation fault at:
99643: i0=retArray->size[0];
p retArray
$1 = (emxArray_real_T *) 0xc1d010
p retArray.size
$2 = (int32_T *) 0x0
p retArray.size[0]
Cannot access memora ar adress 0x0

我的主要职能是不是做错了什么?我希望如此,因为用C语言从Matlab翻译的代码一团糟,或者可能只是对我这个新手来说。如果我在没有返回值的情况下用C进行翻译和编译,代码会很好地工作。

您可以从main调用它:

struct emxArray_real_T *result = malloc(sizeof(struct emxArray_real_T));
// result->size == 0;
// You would need to initialize this too.
// Somewhere in myFun it is accessed like this:
//   *retArray->size = x;
// or
//   x = *retArray->size;
// which causes the fault.
myFun(input arguments, result);

由于我对Matlab一无所知,我无法告诉你这是你必须做的事情,还是应该由某个地方生成的代码来完成。

你可以试着这样修复它:

result->size = malloc(sizeof(int32_T));