Невозможно найти точку ошибки сегментации в моей программе - PullRequest
0 голосов
/ 01 мая 2018

Ниже приведена программа, которую я написал в gdb по следующей ссылке:

https://www.onlinegdb.com/online_c_compiler

#include <stdio.h>
    #include <string.h>


int main()
{
    char abc[] = "love";
    char *hon[100];
    FILE *d, *e;
    int n;
    char c;
    d = fopen("demo.txt", "r");
    /*e = fopen("demo.txt", "w");*/
    /*n = fputs(abc,e);*/
    printf( "jhjhj \n");
    while ((n = getc(d)) != EOF)
       {
        printf( "kjkjkkj \n");
        if (n == 'a')
        {
            /*e = d;*/

            /*n = putc('k',e);*/
        }
    }

    printf("%s", abc);

    printf("abcdefgh %d hjhjh %d", 5, 6);
    putchar(abc[1]);





}

Но при попытке выполнить этот код возникает ошибка сегментации.

Я прошел через следующий вопрос:

Что такое ошибка сегментации?

Ошибка сегментации - это ошибка, которая возникает, когда мы пытаемся получить доступ к области памяти, которая не была назначена, или когда программа не имеет никакого доступа, или когда один процесс пытается получить доступ к области памяти, к которой другой процесс уже обращается.

Итак, я подумал, что открытие одного и того же файла в режиме чтения и записи может привести к этому, хотя я не мог объяснить, как это может происходить.

Таким образом, я прокомментировал часть, которая пытается получить доступ к файлу в режиме «записи». Даже после этого я получил ту же ошибку ошибки сегментации.

Итак, я помещаю некоторые сообщения перед различными частями кода. Оказывается, я не смог получить сообщение прямо перед открытием.

Я не мог понять, как здесь нарушается доступ к правилам памяти, даже после комментирования части, открывшей файл в режиме записи.

Ждем идей и помощи.

Это из-за причины, по которой файл не существует. Но в этом случае при обнаружении EOF он должен выйти из цикла while, но почему ошибка?

1 Ответ

0 голосов
/ 01 мая 2018

Вы не проверяли, что ваш файл успешно открыт

d = fopen("demo.txt", "r");

Если произойдет сбой d будет NULL, а попытка чтения из несуществующего файла приведет к ошибке segfault

n = getc(d) // segfault if d was not actually opened
...