Ошибка сегмента (ядро сброшено) с - PullRequest
0 голосов
/ 20 ноября 2018

Нет проблем при компиляции с 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 голосов
/ 20 ноября 2018
while(ch != '\t')
{
str[k]=ch;
k++;
}

Если ch не '\ t', то это бесконечный цикл, потому что значение ch не изменяется и массив str будет переполнен.

Например, если ch равно 'a', то значение str [k] равно' a ', k увеличено, и повторите этот цикл, пока' a '! =' \ t ', затем str [k] =' a ', k увеличилось, ...до переполнения массива str.

0 голосов
/ 20 ноября 2018
#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 и разместил комментарии там, где произошла ошибка.Вам нужно либо повторно получить ch во вложенном цикле while, либо сделать вложенный цикл while оператором if.В любом случае, ваш segfault:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...