C - 字符* 内存分配错误,除非带有"top -b -n 1"



我正在运行一个 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(( 函数调用处崩溃,而不是错误的实际位置?

最新更新