【问题标题】:Segmentation fault - Unknown reason分段错误 - 未知原因
【发布时间】:2012-11-09 16:26:22
【问题描述】:

即使这两个文件各有 2^14 个值,我的这段代码也会出现分段错误。谁能告诉我原因。

#define N 128
#include<stdio.h>
#include <malloc.h>
int A[N][N];
int B[N][N];
int C[N][N];
void mmul();

int main()
{
    int p,q;
    FILE *fp;
    fp=fopen("A.txt","r");
    if(fp=NULL)
        printf("Error\n");
    printf("A");
    for(p=0;p<(1<<7);p++)
    {
        for(q=0;q<(1<<7);q++)
        {
            fscanf(fp, "%d", &A[p][q]);
        }
    }
    fclose(fp);
    fp=fopen("B.txt","r");
    if(fp=NULL)
        printf("Error\n");
    for(p=0;p<(1<<7);p++)
    {
        for(q=0;q<(1<<7);q++)
        {
            fscanf(fp, "%d", &B[p][q]);
        }
    }
    fclose(fp);
    printf("here");
    mmul();
}

void mmul()
{
    int i,j,k;
    unsigned int sum;
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            sum=0;
            for(k=0;k<N;k++)
            {
                sum=sum+(A[i][k]*B[k][j]);
            }
            C[i][j]=sum;
        }
    }
}

【问题讨论】:

  • 如果您在您的平台调试器(gdb 等)下运行它,您可能会立即被告知是什么导致了 seg-fault,这可能是这段代码中唯一的引用原始指针的东西:FILE *fp 和你的赋值,而不是评估检查,到 NULL。
  • -1 我刚刚查看了 3 个标记为相关的随机问题,并在所有问题中发现了使用调试器或运行 valgrind 的建议。这清楚地表明您没有那么多look around。

标签: c segmentation-fault


【解决方案1】:

编译时出现警告

if (fp = NULL)

【讨论】:

    【解决方案2】:
    if(fp=NULL)
    printf("Error\n");`
    
    • 它是整个if 身体。因此,如果没有文件,您将得到一个 NULL fp,打印“错误”并使用 NULL fp 继续执行。它会导致分段错误。

    另外,它是一个赋值,而不是一个比较,所以你总是得到NULL fp,而不是打印错误。

    需要添加exit语句:

    if (fp == NULL) {
       fprintf(stderr, "Error: failed to open file\n");
       return -1;
    }
    

    【讨论】:

    • 但是文件在那里。那是什么问题
    • 哦,是的...明白了!没仔细看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多