【问题标题】:I couldn't figure out what error is there in my code - segmentation fault core dumped error in C [closed]我无法弄清楚我的代码中有什么错误-C 中的分段错误核心转储错误 [关闭]
【发布时间】:2019-08-05 18:50:05
【问题描述】:
#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。虽然代码运行,但它显示了终端中转储的分段错误核心。我完全不明白为什么会发生这种情况。谁能帮我找出代码中的错误。

【问题讨论】:

  • 如果文件不存在怎么办?它会打印任何输出吗?
  • 在core文件上使用gdb看看问题出在哪里
  • 请提供文件内容

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


【解决方案1】:

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

if(!a[i])continue;

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

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

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

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

gcc -g myfile.c -o myfile

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

valgrind ./myfile

如果您的系统上没有 valgrind,请不要忘记安装它。

【讨论】:

  • 您能否详细说明您对 -g ...valgrind 事情的第一个答案。在终端中编译和运行时应该如何放置该命令
  • 当然。我将编辑我的答案。
  • gcc filename.c -o filename....我使用了这个命令...我应该如何修改它才能得到你所说的。
【解决方案2】:

你的代码可以做很多备注

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)在你的代码中被使用了很多次,如果你决定改变元素的数量,你将不得不在每个地方都改变它,使用 #define 更简单或sizeof(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",&amp;b[i][j][k]) != 1) { ...error management... }

【讨论】:

  • 感谢您的回答。不幸的是,没有任何效果。错误继续存在
  • @user135580 文件未打开时你在做什么?文件包含什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 2016-03-10
相关资源
最近更新 更多