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

时间:2019-03-14 18:44:16

标签: c linux gcc segmentation-fault file-handling

#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,其子级最多为infile7。尽管代码运行了,但显示了终端中转储的分段故障核心。我完全不知道为什么会这样。有人可以帮我找出代码中的错误吗?

2 个答案:

答案 0 :(得分:3)

使用-g编译并运行槽valgrind会在没有文件的情况下显示错误行19。
也许您应该添加

if(!a[i])continue;

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

还请查看Input validation using scanf(),因为您应该检查scanf返回值。

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

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

gcc -g myfile.c -o myfile

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

valgrind ./myfile

如果不在您的系统中,请不要忘记安装valgrind。

答案 1 :(得分:1)

您的代码可以做很多注释

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)在您的代码中使用了很多次,如果您决定更改元素的数量,则必须在每个位置进行更改,使用{ {1}}或#define

4)在

sizeof(a)/sizeof(a[0])

您非常需要所需的大小,甚至您的 int 都在64b中,并且您增加了 a 中的条目数量(无需更改即可拥有足够的堆栈)还是文件说明)20个数字足以表示一个正数,所以char filename[100]; sprintf(filename,"infile%d.txt",i); 就足够了

5)在

char filename[20+10+1];

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

6)在

float b[10][4][4];
...
for(j=0;j<2;j++)
{
   for (k=0;k<3;k++)
  • 您不会检查相应文件是否已打开,因此如果 fscanf(a[i],"%f",&b[i][j][k]); 不为NULL,则可能是由于文件未打开而导致的分段错误

  • 您不会检测到文件结尾,或者如果文件不包含有效的浮动,则需要执行例如a[i]