gurukiran4u Ответов: 2

Поток 1 получил сигнал SIGSEGV, ошибка сегментации


я попытался отладить свой код с помощью gdb я получаю сообщение об ошибке
Thread 1 received signal SIGSEGV, Segmentation fault


Что я уже пробовал:

вот мой код
typedef struct list<br />
{<br />
    node *head;<br />
    node *tail;<br />
    int number_of_nodes;<br />
} List;<br />
<br />
typedef struct queue<br />
{<br />
    List *ptr_list;<br />
} Queue;<br />
<br />
void queue_initialize(Queue *queue_list)<br />
{<br />
//TODO<br />
    printf("hello inside queue_initialize\n");  <br />
    list_initialize(queue_list->ptr_list);<br />
    printf("hello after queue_initialize\n");<br />
    return;<br />
    }<br />
<br />
void list_initialize(List *ptr_list)<br />
{<br />
//TODO<br />
    printf("hello in list_initialize\n");<br />
    ptr_list->head=0;<br />
    printf("hello\n");<br />
    ptr_list->tail=0;<br />
    printf("hello\n");<br />
    ptr_list->number_of_nodes=0;<br />
    printf("hello after list_initialize\n");<br />
    <br />
}

когда я вызываю функцию queue_initialize(Queue *queue_list), я получаю этот вывод

hello before queue_initialize<br />
hello inside queue_initialize<br />
hello in list_initialize


но ожидаемый результат таков

hello before queue_initialize<br />
hello inside queue_initialize<br />
hello in list_initialize<br />
hello <br />
hello<br />
hello after list_initialize


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

я почти уверен, что ошибка здесь, в этих строках

ptr_list->head=0;<br />
ptr_list->tail=0;<br />
ptr_list->number_of_nodes=0;

KarstenK

плз, переформатировать текст, похоже, скопирован с какого-то HTML :-(

2 Ответов

Рейтинг:
1

Sandeep Mewara

Цитата:
Ошибка сегментации возникает, когда программа пытается получить доступ к ячейке памяти, доступ к которой ей запрещен, или пытается получить доступ к ячейке памяти способом, который не разрешен (например, попытка записи в ячейку, доступную только для чтения, или перезапись части операционной системы).


В Unix-подобных операционных системах сигнал SIGSEGV отправляется процессу, который обращается к недопустимому адресу памяти.

Для получения некоторых подробностей о ошибка сегментации[^].


В вашем случае, скорее всего, ваш ptr_list не имеет допустимого значения. Ваша настройка очереди выглядит неправильной, и я не уверен, как определяется ваш узел (должен быть определен, если вы получаете какой-то вывод).

В C это не правильная настройка - вам нужно добавить ключевое слово struct перед указателями для их подключения:
struct Node { 
    int data; 
    struct Node* next; 
};


Я бы посоветовал прочитать и узнать о связанном списке.
Ссылаться:
Программа Linked List в C - Tutorialspoint[^]
Связанный Список | Набор 1 (Введение) - GeeksforGeeks[^]


CPallini

5.

Sandeep Mewara

Спасибо CPallini. :)

Рейтинг:
0

CPallini

Вы должны динамически выделять память для ваших объектов. Попробуйте, как отправную точку:

#include <stdio.h>
#include <stdlib.h>
// I assume your definition of node is compatible with the following:
typedef struct node
{
  int value;
  struct node * next;
} Node;

typedef struct list
{
  Node *head;
  Node *tail;
  int number_of_nodes;
} List;

typedef struct queue
{
    List *ptr_list;
} Queue;

void list_initialize(List *ptr_list)
{
  printf("hello in list_initialize\n");
  ptr_list->head=0;
  printf("hello\n");
  ptr_list->tail=0;
  printf("hello\n");
  ptr_list->number_of_nodes=0;
  printf("hello after list_initialize\n");
}
void queue_initialize(Queue *queue_list)
{
  queue_list->ptr_list = (List*) malloc(sizeof(List));
  // TODO: handle possible malloc failure
  printf("hello inside queue_initialize\n");
  list_initialize(queue_list->ptr_list);
  printf("hello after queue_initialize\n");
  return;
}


int main()
{
  Queue queue;
  queue_initialize(&queue);

  return 0;
}