我搞不清楚我的代码分段错误中有什么错误——C中的核心转储错误

我搞不清楚我的代码分段错误中有什么错误——C中的核心转储错误,c,linux,gcc,segmentation-fault,file-handling,C,Linux,Gcc,Segmentation Fault,File Handling,我已经用C写了上面的代码,它只读取8个不同的文件并在终端上打印出来。文件名为infile0、infile1和son,最多为infile7。虽然代码运行,但它显示了转储在终端中的分段故障内核。我根本不明白为什么会这样。有人能帮我找出代码中的错误吗。使用-g编译并通过valgrind运行时,如果没有文件存在,则会出现错误行19。 也许你应该加上 如果a[我]继续; 在scanf之前。并设置一些消息或默认值 还可以查看,因为您应该检查scanf返回值 我希望它能有所帮助,这是我的第一个so贡献 编辑:

我已经用C写了上面的代码,它只读取8个不同的文件并在终端上打印出来。文件名为infile0、infile1和son,最多为infile7。虽然代码运行,但它显示了转储在终端中的分段故障内核。我根本不明白为什么会这样。有人能帮我找出代码中的错误吗。

使用-g编译并通过valgrind运行时,如果没有文件存在,则会出现错误行19。 也许你应该加上

如果a[我]继续; 在scanf之前。并设置一些消息或默认值

还可以查看,因为您应该检查scanf返回值

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

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

gcc-gmyfile.c-omyfile 然后运行你的二进制文件。 它会告诉你任何内存问题:泄漏,无效的红色/写入

valgrind./myfile
如果valgrind不在您的系统上,请不要忘记安装它。

可以从您的代码中进行很多注释

1英寸

main返回int,而不是void,因此必须为

int main

2英寸

3 10变成8在代码中使用了很多次,如果您决定更改元素的数量,则必须在每个位置都更改它,使用define或sizeofa/sizeofa[0]更简单

4英寸

您对所需的大小非常慷慨,即使您的int为64b,并且您在一个无更改的文件中增加了如此多的条目数,以获得足够的堆栈或文件描述。无论如何,20位数字就足以表示正数,因此char filename[20+10+1];够了

5英寸

您不检查相应的文件是否已打开,因此如果[i]不为NULL,您的分段错误可能是因为文件未打开

您不会检测到文件结尾,也不会检测到文件不包含有效浮点,例如,如果fscanfa[i]、%f、&b[i][j][k]!=1{…错误管理…}


如果文件不在那里怎么办?它是否打印任何输出?请在核心文件上使用gdb查看问题所在。请提供文件的内容。请详细说明关于-g…valgrind的第一个答案。在terminalSure中编译和运行时,应该如何放置该命令。我将编辑我的answer.gcc filename.c-o filename…我使用了这个命令…我应该如何修改它以获得您所说的内容。谢谢您的回答。不幸的是,什么都不起作用。错误仍在继续exist@user135580当文件未打开时,您在做什么?这些文件包含什么?
#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]);
            }
        }
    }
}
 void main()
 FILE *a[10];  
 ..
 for(i=0;i<8;i++)
 {
    ...
    a[i]=fopen(filename,"r");
  FILE *a[8];
char filename[100];
sprintf(filename,"infile%d.txt",i);
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]);