Работаю над обучением 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;
}
}
Ваш компилятор не предупреждает вас об этом? Должно. При использовании gcc или clang всегда компилируйте с -Wall -Wextra
, чтобы помочь отловить множество проблем.
Проблема в заявлении fscanf(f,"%d",line->value)
. fscanf
ожидает адрес типа int, но вы даете ему фактическое целое число. Это segfault, потому что он обрабатывает это int как ячейку памяти и пытается записать в нее. Вместо этого замените его на fscanf(f,"%d",&(line->value))
, и он должен работать.
fscanf(f,"%d",line->value)
==>fscanf(f,"%d",&line->value)
. Несвязанный, в C,main
должен всегда возвращатьint
.