我无法弄清楚我的代码中有什么错误 - C 中的分段错误核心转储错误


#include<stdio.h>
void main()
{
FILE *a[10];  
int i,j,k;
float b[10][4][4];
for(i=0;i<8;i++)
{
char filename[100];
sprintf(filename,"infile%d.txt",i);
a[i]=fopen(filename,"r");
}
for(i=0;i<8;i++)
{
for(j=0;j<2;j++)
{
for (k=0;k<3;k++)
{ 
fscanf(a[i],"%f",&b[i][j][k]);
}
}
}
for (i=0;i<8;i++)
{
printf("n-----------------%d--------------------",i);
for(j=0;j<2;j++)
{
for(k=0;k<3;k++)
{
printf("nb[%d][%d][%d]=%f",i,j,k,b[i][j][k]);
}
}
}
}

我已经用 C 编写了上面的代码。它只读取 8 个不同的文件并将其打印在终端中。文件名为 infile0、infile1 和子 on 到 infile7。尽管代码运行,但它会显示在终端中转储的分段故障核心。我完全想不通为什么会这样。有人可以帮助我找出代码中的错误吗?

当不存在文件时,使用 -g 编译并运行 valgrind 会给出错误行 19。
也许你应该添加

if(!a[i])continue;

在扫描之前。(并设置一些消息或默认值)。

另请查看使用 scanf() 进行输入验证,因为您应该检查 scanf 返回值。

我希望它有所帮助,这是我的第一个贡献。

编辑: -g 标志用于编译器,例如

gcc -g myfile.c -o myfile

然后运行你的二进制槽瓦尔格林德。
它会告诉你内存的任何问题:泄漏,无效的红色/写入...

valgrind ./myfile

不要忘记安装 valgrind 如果它不在您的系统上。

可以从你的代码中完成很多注释

1) 在

void main()

main返回一个int,而不是void,所以必须是

int main()

2) 在

FILE *a[10];  
..
for(i=0;i<8;i++)
{
...
a[i]=fopen(filename,"r");

为什么你有一个包含 10 个条目的数组只使用其中的 8 个?,最好有

FILE *a[8];

3)10(变成8)在你的代码中被多次使用,如果你决定改变元素的数量,你将不得不在每个地方改变它,使用#definesizeof(a)/sizeof(a[0])

更简单4) 在

char filename[100];
sprintf(filename,"infile%d.txt",i);

您对所需的大小非常慷慨,即使您的int在 64b 中,并且您增加了a中的条目数量(无论如何都没有更改以有足够的堆栈或文件描述)20 位数字足以获得正数,所以char filename[20+10+1];就足够

了5) 在

float b[10][4][4];
...
for(j=0;j<2;j++)
{
for (k=0;k<3;k++)

喜欢 2) 如果您不使用所有条目,则没有理由使用如此大的数组

6) 在

fscanf(a[i],"%f",&b[i][j][k]);
  • 您不检查相应的文件是否已打开,因此如果a[i]不是 NULL,则可能是因为文件未打开而导致分段错误

  • 您没有检测到文件的末尾,如果文件不包含有效的浮点数,则需要执行例如if (fscanf(a[i],"%f",&b[i][j][k]) != 1) { ...error management... }

相关内容

  • 没有找到相关文章

最新更新