使用c的段故障(核心已转储)

时间:2018-11-20 01:30:39

标签: c core

gcc上使用linux编译时没有问题,但是当我运行此代码时,它总是报告

  

段错误(核心已转储)

#include <stdio.h>
void main ()
{
    FILE *fp;
    char ch,str[10240],arr[10800][3];
    int i,j,k;
    if((fp=fopen("structure_backup.dat","r"))==NULL)
        {
        printf("\nCannot open file!!!");
        getchar();
        exit(1);
        }

    ch = ' ';
    i = 0,j=0,k=0;
    while(ch != EOF)
        {
            ch = fgetc(fp);
            while(ch !='\n')
                {
                    while(ch != '\t')
                    {
                        str[k]=ch;
                        k++;
                    }
                    arr[i][j]=str;
                    k=0;
                    j++;
                }
            arr[i][j]=str;
            k=0;
            j=0;
            i++;
        }
    fclose(fp);
}

2 个答案:

答案 0 :(得分:2)

#include <stdio.h>
void main ()
{
    FILE *fp;
    char ch,str[10240],arr[10800][3];
    int i,j,k;
    if((fp=fopen("structure_backup.dat","r"))==NULL)
        {
        printf("\nCannot open file!!!");
        getchar();
        exit(1);
        }

    ch = ' ';
    i = 0,j=0,k=0;
    while(ch != EOF)
        {
            ch = fgetc(fp);
            while(ch !='\n')
                {
                    while(ch != '\t') // <=== HERE is where you go off the rails, never escape this whileloop
                    {
                        str[k]=ch;//<==== NOW YOU STORE ch in str[k], never escaping the while loop
                        k++;//<=== k goes to MAX_SIZE here, eventually causing the write above to be out of bounds.  str[9999999999] is an invalid index for example.
                    }
                    arr[i][j]=str;
                    k=0;
                    j++;
                }
            arr[i][j]=str;
            k=0;
            j=0;
            i++;
        }
    fclose(fp);
}

我已经复制了您的OP来源,并在发生段错误的地方添加了注释。您或者需要在嵌套的while循环中重新获取ch,或者使嵌套的while循环成为if语句。无论哪种方式都存在段错误:)

答案 1 :(得分:0)

while(ch != '\t')
{
str[k]=ch;
k++;
}

如果ch不是'\ t',则这是无限循环,因为ch的值不会改变并且数组str将会溢出。

例如,如果ch为'a',则str [k]的谷值为'a',k增加,然后在'a'!='\ t'时再次执行此循环,然后str [k] ='a',k增加,...,直到数组str溢出。