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

Работал над обучением себя 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;
    }
}

1 Ответ

0 голосов
/ 27 сентября 2018

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

...