我搞不清楚我的代码分段错误中有什么错误——C中的核心转储错误
我已经用C写了上面的代码,它只读取8个不同的文件并在终端上打印出来。文件名为infile0、infile1和son,最多为infile7。虽然代码运行,但它显示了转储在终端中的分段故障内核。我根本不明白为什么会这样。有人能帮我找出代码中的错误吗。使用-g编译并通过valgrind运行时,如果没有文件存在,则会出现错误行19。 也许你应该加上 如果a[我]继续; 在scanf之前。并设置一些消息或默认值 还可以查看,因为您应该检查scanf返回值 我希望它能有所帮助,这是我的第一个so贡献 编辑: -g标志用于编译器,例如 gcc-gmyfile.c-omyfile 然后运行你的二进制文件。 它会告诉你任何内存问题:泄漏,无效的红色/写入 valgrind./myfile我搞不清楚我的代码分段错误中有什么错误——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贡献 编辑:
如果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]);