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给你。