我正在运行一个 C 代码,该代码需要 MD 轨迹文件中的步骤数。它首先调用一个获取步数的函数。
函数调用为
int steps=get_steps(argv[2]);
函数本身(在单独的头文件中(是
int get_steps(char* f){
printf("file_len function calln");
char *cmd=malloc(sizeof(char)*120);
printf("%p",cmd);
printf("created command");
sprintf(cmd,"wc -l %s > lines.txt",f);
system(cmd);
printf("called system command");
FILE *f1;
f1=fopen("lines.txt","r");
int steps;
fscanf(f1,"%d",&steps);
fclose(f1);
f1=fopen(f,"r");
int atoms;
fscanf(f1,"%d",&atoms);
fclose(f1);
sprintf(cmd,"rm lines.txt");
system(cmd);
free(cmd);
return (int)steps/(atoms+2);
}
我正在编辑此代码,以便它从 argc 获取更少的输入参数,当我编译和测试代码时,由于分段错误,它在这一点上崩溃了。
但是,当我运行代码时
./migration_binding Na200_Mg10 traj.xyz top -b -n 1
它工作正常。关于这里可能出现什么问题的任何提示?
如果要访问第二个参数:argv[2]
,则需要至少使用 2 个参数执行程序。否则,它将尝试读取不属于您的内存,这通常以分段错误结束。
您还可以检查 argv
数组的长度 - 这是第一个主函数参数:
int main(int argc, char *argv[])
请注意,第一个参数始终是可执行文件的路径。
因此,一时兴起,我在函数调用后注释掉了main((中的行。事实证明,我使用的是我没有错误定位的字符*(输出文件的标签,如"_junction_location.dat"和"_ion_timeseries.dat"放在argv[1]之后(。
但是,我的问题仍然与命令式编程有关。这些错误是代码在程序崩溃之前执行的原因。为什么程序会在 get_steps(( 函数调用处崩溃,而不是错误的实际位置?