我出于目的使用了他人的代码。此代码使用从.mex64
代码生成的C
文件。该文件中有一条打印语句-它在命令窗口上显示一些内容。我需要修改此语句的文本。我可以重新编译,但是我没有完整的源代码。
当我在文本编辑器中打开mex64
文件时,可以看到要以纯文本打印的文本。但是,如果我尝试修改并运行它,则matlab会因系统错误而崩溃-
Abnormal termination: Access violation
这是我尝试重现此问题的方法。我写了以下代码-
#include <stdio.h>
#include "C:\Program Files\MATLAB\R2017b\extern\include\mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
main();
return;
}
int main(){
printf("Hello\n");
}
生成的mex64
文件正常运行-打印文本“ Hello”。但是,当我在mex64
文件中找到单词“ Hello”并将其修改为“ Hell”时,它如上所述崩溃了。看起来MATLAB中存在某种完整性检查失败了。
有人可以解释发生了什么事吗?
是否可以通过某种方式修改mex64
文件并成功运行它?
答案 0 :(得分:3)
如果更改文本长度,则其他内容会在文件中四处移动,从而使内部指针出错。
但这可能不是唯一发生的事情。您的文本编辑器可能还会更改很多其他字节的值(例如,文本中0-31范围内的值是无意义的,通常文本编辑器会忽略它们或更改它们)。
您应该在二进制文件编辑器中执行此操作,这些文件通常称为hex editor。
在已编译的代码中更改字符串中字节的值非常好。但只能更改其值,请勿删除或添加任何字节。
您会注意到所有字符串都以0字节结尾。那是字符串结尾标记。不要覆盖它。但是,您可以(通常)提前添加一个以使字符串更短。也就是说,您在字符串的末尾添加了一个零字节,并且不删除其后的任何字节。