fprintf的问题

jon*_*alm 1 c printf gdb segmentation-fault

我在C中运行模拟,需要存储3个100x100矩阵~1000次.当我没有将数据写入文件时,我的程序运行正常.但是当我运行我的程序并写入数据时,我会在250个步骤左右后得到分段错误.我不明白为什么.

我的保存功能看起来像这样

void saveData(Simulation* sim, int number) {
   sprintf(pathname_vx, "data/xvel%d.dat", number);
   sprintf(pathname_vy, "data/yvel%d.dat", number);
   sprintf(pathname_rho, "data/rho%d.dat", number);
   FILE* vx_File = fopen(pathname_vx, "w");
   FILE* vy_File = fopen(pathname_vy, "w");
   FILE* rho_File = fopen(pathname_rho, "w");
   int iX, iY;
   double ux, uy, rho;
   for (iY=0; iY<sim->ly; ++iY) {
       for (iX=0; iX<sim->lx; ++iX) {
           computeMacros(sim->lattice[iX][iY].fPop, &rho, &ux, &uy);
           fprintf(vx_File, "%f ", ux);
           fprintf(vy_File, "%f ", uy);
           fprintf(rho_File, "%f ", rho);
       }
       fprintf(vx_File, "\n");
       fprintf(vy_File, "\n");
       fprintf(rho_File, "\n");
   }
   fclose(vx_File);
   fclose(vx_File);
   fclose(vy_File);
}
Run Code Online (Sandbox Code Playgroud)

其中'Simulation'是一个包含晶格(100x100矩阵)的结构,其中有3个不同的变量'rho','ux','uy'.'number'参数只是一个计数变量,用于正确命名文件.

gdb说以下内容,但它对我没什么帮助.

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000010
0x00007fff87c6ebec in __vfprintf ()
Run Code Online (Sandbox Code Playgroud)

我在编程方面不是很有经验,所以我猜有更好的方法可以将数据写入文件.任何澄清我的方法不起作用的尝试都受到高度赞赏.

谢谢

乔恩

Ele*_*Wig 6

看起来你要关闭vx_File两次,而不是关闭rho_File.这意味着您每次迭代都会打开rho_File,因此每次都会使用文件描述符.

我猜这个程序没有用完文件描述符.(因为这发生在第250次迭代,我猜你的极限是256).一旦你没有文件描述符,其中一个fopen()调用将返回NULL.由于您不检查fopen()的返回值,因此当您尝试将fwrite转换为NULL句柄时将发生崩溃.