Написание двусвязного списка с ошибками сегментации двоичного файла
Это моя студенческая структура с информацией, которую я читаю через двоичный файл
typedef struct student_t {
//data in here
} student_t;
вот как я их объявил в основном
double_linkedlist_t* listPtr;
student_t students;
node_t* node = NULLL;
так инициализируется мой файл
FILE *file;
printf("What file would you like to select?\n");
fgets( filename, MAX_NAME_LENGTH, stdin );
strtok(filename, "\n");
fflush(stdin);
file = fopen(filename, "rb+wb");
Вот как мой fwrite выглядит в моей главной. Я продолжаю получать ошибку сегментации, и все примеры, которые я видел о том, как записать двусвязный список в двоичный файл, заставили вас сделать это. Поэтому я прихожу сюда для объяснения того, почему или, может быть, какие-то изменения в том, что у меня есть. У меня также есть мой двусвязный список, объявленный как listPtr в main, и мой узел как узел.
это мой иници
node_t* Init_Node( student_t data )
{
node_t* node = (node_t*) malloc( sizeof( node_t ) );
node -> students = data;
node->nextPtr = NULL;
node->prevPtr = NULL;
return node;
}
это моя структура узла вместе с прототипом для nodeinit
typedef struct node_t
{
student_t students;
struct node_t* nextPtr;
struct node_t* prevPtr;
} node_t;
//prototypes
node_t* Init_Node( student_t );
node = listPtr->headPtr; //segmentation faults here
while(node!=NULL)
{
fwrite(node, sizeof(student_t), 1, file);
node=node->nextPtr;
}
любая помощь в том, почему это происходит, будет принята с благодарностью, я никогда не писал в двоичный файл с двусвязным списком:/.
1 ответ
Поскольку вы не показываете более полный код, я смогу только догадываться, но проблема заключается в следующем:
double_linkedlist_t* listPtr;
Кажется, это локальная переменная, объявленная внутри main
функция, и проблема в том, что локальные переменные внутри функций не инициализируются. Таким образом, имея объявление и не заставляя указатель фактически указывать куда-либо, он будет указывать на кажущееся случайным место.
Неинициализированные локальные (нестатические) переменные будут иметь неопределенное значение, а разыменование указателя без указания точки в любом месте приведет к неопределенному поведению, которое является очень распространенной причиной сбоев.
Есть два возможных решения:
Выделите память и сделайте указатель на нее:
double_linkedlist_t* listPtr = malloc(sizeof *listPtr);
Не объявляйте его как указатель для начала, а когда указатель необходим, используйте оператор адреса
&
чтобы получить:double_linkedlist_t list; list.headPtr = NULL; list.tailPtr = NULL; ... callSomeFunction(&list);