【问题标题】:problem with fprintffprintf 的问题
【发布时间】:2011-03-11 18:11:41
【问题描述】:

我在 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);
}

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

gdb 说了以下内容,但对我帮助不大。

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

我在编程方面没有那么丰富的经验,所以我想有更好的方法可以将数据写入文件。任何试图澄清为什么我的方法不起作用的尝试都受到高度赞赏。

谢谢

乔恩

【问题讨论】:

  • 你能告诉我们究竟是哪条线路出了问题吗?
  • 感谢大家的意见。正如 Elecric Wig 指出的那样,我的 fclose 语句中有一个明显的错误。抱歉问了一个愚蠢的问题。 j

标签: c gdb segmentation-fault printf


【解决方案1】:

看起来您要关闭 vx_File 两次,而根本没有关闭 rho_File。这意味着您在每次迭代时都打开 rho_File,因此每次都用完一个文件描述符。

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

【讨论】:

  • 呵呵。非常感谢您指出愚蠢的错误。你让我开心。
【解决方案2】:

看起来像 NULL 指针取消引用。您需要检查 fopen() 的结果以确保它成功(非 NULL 结果)。

【讨论】:

    【解决方案3】:

    当您创建那一千个 100x100 矩阵(或任何正在发生的事情)时,可能内存不足。然后,您可能会得到一个不完整的 sim-&gt;lattice,其中可能包含 NULL 指针。

    你检查malloc() 调用是否成功?如果他们不能分配内存,他们会返回NULL

    【讨论】:

      猜你喜欢
      • 2015-08-24
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多