Указатели C / Linux и чтение файлов - ошибка сегментации?

Работаю над обучением C в среде Linux и написал код для чтения / записи из файла. Программа компилируется, но когда я ее запускаю, я получаю «ошибку сегментации». Это вся информация, которую мне дали; Я даже не знаю, откуда в моем коде ошибка.

Поскольку я новичок в C, я сразу же зашел в google: "Core Dump/Segmentation fault is a specific kind of error caused by accessing memory that “does not belong to you."

Это имеет смысл, и многие примеры здесь показывают несколько распространенных ошибок, в основном связанных с переменными-указателями. Я просматривал свой код несколько раз, но не могу найти, где я незаконно обращаюсь к памяти. Может ли кто-нибудь с лучшими знаниями C помочь мне найти мою ошибку, а также, возможно, лучше объяснить, как она привела к ошибке сегментации?

#include <stdio.h>
#include <stdlib.h>

struct node
{
    int value;
    struct node *next;
} node;

void insert(struct node*);
struct node * head = NULL;

void main(int argc, char * argv[])
{
    if (argc!=3)
    {
        printf("Please provide the input and output text file names as %s name1 name2\n", argv[0]);
        return;
    }

    FILE *f;
    if (!(f=fopen(argv[1], "r")))
    {
        printf("Input file %s cannot be opened.\n", argv[1]);
        return;
    }

    struct node * line = (struct node*)malloc(sizeof(struct node));
    if (line==NULL)
    {
        printf("Cannot do dynamic memory management.\n");
        return;
    }

    while(fscanf(f,"%d",line->value)!=EOF)
    {
        printf("%d ",line->value);
        line->next=NULL;
        insert(line);
        line=(struct node*)malloc(sizeof(struct node));
        if (line==NULL)
        {
            printf("Cannot do dynamic memory management.\n");
            return;
        }
    }
    free(line);
    printf("content:\n");
    while(head!=NULL)
    {
        line=head;
        head=head->next;
        printf("%d ",line->value);
        free(line);
    }
    fclose(f);
}

void insert(struct node * element)
{
    struct node * temp = head;
    struct node * pretemp = NULL;
    while(temp!=NULL && temp->value > element->value)
    {
        pretemp=temp;
        temp=temp->next;
    }
    if (pretemp==NULL)
    {
        element->next=head;
        head=element;
    }
    else
    {
        pretemp->next=element;
        element->next=temp;
    }
}
fscanf(f,"%d",line->value) ==> fscanf(f,"%d",&line->value). Несвязанный, в C, main должен всегда возвращать int.
WhozCraig 27.09.2018 04:01

Ваш компилятор не предупреждает вас об этом? Должно. При использовании gcc или clang всегда компилируйте с -Wall -Wextra, чтобы помочь отловить множество проблем.

Shawn 27.09.2018 04:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в заявлении fscanf(f,"%d",line->value). fscanf ожидает адрес типа int, но вы даете ему фактическое целое число. Это segfault, потому что он обрабатывает это int как ячейку памяти и пытается записать в нее. Вместо этого замените его на fscanf(f,"%d",&(line->value)), и он должен работать.

Другие вопросы по теме