char *内存分配错误除非使用'top -b -n 1'

时间:2018-03-10 22:32:44

标签: c segmentation-fault malloc

我正在运行需要MD轨迹文件中步数的C代码。它首先调用一个获取步数的函数。

函数调用是

int steps=get_steps(argv[2]);  

并且函数本身(在单独的头文件中)是

int get_steps(char* f){
  printf("file_len function call\n");
  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

它工作正常。关于这里可能出错的任何提示?

2 个答案:

答案 0 :(得分:0)

如果您正在访问第二个参数:argv[2],则需要使用至少2个参数执行该程序。否则它将尝试读取不属于你的内存,这通常以分段错误结束。

您还可以检查argv数组的长度 - 这是第一个主函数参数:

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

请注意,第一个参数始终是可执行文件的路径。

答案 1 :(得分:0)

所以一时兴起,我在函数调用后注释掉main()中的行。事实证明我正在使用char * s(输出文件的标签,例如" _junction_location.dat"和" _ion_timeseries.dat"放在argv [1]之后)我没有' t malloc' ed。

然而,我的问题仍然与命令式编程有关。这些错误是代码的原因,该代码在程序崩溃之前执行。为什么程序会在get_steps()函数调用时崩溃,而不是在错误发生的地方崩溃?