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)
我在编程方面不是很有经验,所以我猜有更好的方法可以将数据写入文件.任何澄清我的方法不起作用的尝试都受到高度赞赏.
谢谢
乔恩
看起来你要关闭vx_File两次,而不是关闭rho_File.这意味着您每次迭代都会打开rho_File,因此每次都会使用文件描述符.
我猜这个程序没有用完文件描述符.(因为这发生在第250次迭代,我猜你的极限是256).一旦你没有文件描述符,其中一个fopen()调用将返回NULL.由于您不检查fopen()的返回值,因此当您尝试将fwrite转换为NULL句柄时将发生崩溃.
| 归档时间: |
|
| 查看次数: |
1187 次 |
| 最近记录: |