Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 显然我';我正在破坏堆栈-但如何?_C_Matlab_Segmentation Fault - Fatal编程技术网

C 显然我';我正在破坏堆栈-但如何?

C 显然我';我正在破坏堆栈-但如何?,c,matlab,segmentation-fault,C,Matlab,Segmentation Fault,我有一个非常简单的程序,如下所示,它从.mat文件(来自Matlab的数据文件)中读取一个值并打印出来。出于某种原因,我在退出main()后出现了一个segfault错误-我可以运行gdb my_程序并逐步完成整个方法,但只要main()完成,我就会在一个与Matlab相关的库(libmwfl.so,一个libmat.so)中输入一些方法,该库抛出一个segfault 我对C语言编程完全陌生,但读过一些书后,我怀疑我不是不知何故,就是不知何故。但是,我在我的代码中看不到任何这些,正如我所说的,我

我有一个非常简单的程序,如下所示,它从
.mat
文件(来自Matlab的数据文件)中读取一个值并打印出来。出于某种原因,我在退出main()后出现了一个segfault错误-我可以运行
gdb my_程序
并逐步完成整个方法,但只要
main()
完成,我就会在一个与Matlab相关的库(
libmwfl.so
,一个
libmat.so
)中输入一些方法,该库抛出一个segfault

我对C语言编程完全陌生,但读过一些书后,我怀疑我不是不知何故,就是不知何故。但是,我在我的代码中看不到任何这些,正如我所说的,我可以使用调试器一步一步地完成我的代码,而不会出现问题

我做错了什么

#include <stdlib.h>
#include <stdio.h>
#include <mat.h>

int main(int argc, char *argv[]) {

    double value;
    MATFile *datafile;
    datafile = matOpen("test.mat", "r");

    mxArray *mxv;
    mxv = matGetVariable(datafile, "value");
    value = *mxGetPr(mxv);
    mxFree(mxv);
    matClose(datafile);

    printf("The value fetched from the .mat file was: %f", value);

    return 0;
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
双重价值;
MATFile*数据文件;
数据文件=matOpen(“test.mat”,“r”);
MX阵列*mxv;
mxv=matGetVariable(数据文件,“值”);
值=*mxGetPr(mxv);
mxFree(mxv);
matClose(数据文件);
printf(“从.mat文件获取的值是:%f”,value);
返回0;
}

文档建议使用功能
mxDestroyArray
而不是
mxFree
来释放
mxArray
。使用
mxFree
可能会弄乱matlab的堆。从

不正确地销毁mxArray

您不能使用
mxFree
销毁
mxArray

警告:您试图在
阵列上调用
mxFree
MXArray
的析构函数是
mxDestroyArray
;请打电话 而是这个。MATLAB将尝试修复该问题并继续, 但这将导致未来版本中出现内存故障

导致警告的示例

在下面的示例中,
mxFree
不会破坏数组对象。 此操作释放与数组关联的结构标头, 但是MATLAB仍然会像需要创建数组对象一样运行 摧毁。因此,MATLAB将尝试破坏数组对象,并在 进程将再次尝试释放其结构标头

mxArray*temp=mxCreateDoubleMatrix(1,1,mxREAL)

  ...
mxFree(温度);/*不正确*/

  ...
解决方案。

改为调用
mxDestroyArray

mxDestroyArray(临时);/*正确*/

  ...

如果我站在你的立场,我会检查数据文件是否为空(这意味着该文件无法打开)。@georgestmatiou看着程序,有那么一会儿,我也有同样的感觉。但如果是这种情况,程序将(很可能)在
main
内由于空指针解引用而崩溃,而不是在退出
main
后,如OP所示。Giuseppe Guerrini的回答发现了确切的问题,这非常有效-非常感谢!但是,我还没有看到这部分文档。你愿意提供一个链接吗?(那里可能有更多我可以知道的事情……;)@TomasLycken给你。