C - Ошибка сегментации при использовании указателей - PullRequest
0 голосов
/ 28 октября 2018

У меня есть список из 6 элементов типа структуры:

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

Я пытаюсь создать функцию для инициализации этих шести элементов, присваивая случайное значение int каждому члену значения.

void initializeList(struct entry *l_p)
{
    while(l_p!=_END)
    {
        l_p->value=rand()%999;
        l_p=l_p->next;
    }
}

Когда эта функция вызывается в основном, *l_p указывает на самый первый элемент списка._END - это глобальная константа, определяемая следующим образом:

struct entry const *_END=(struct entry *)0;

Теперь, каждый раз, когда я запускаю свой код, я получаю следующее:

Ошибка сегментации (ядро сброшено)

Процесс возвратил 139 (0x8B)

Я знаю, это означает, что я пытаюсь получить доступ к части памяти, к которой у меня нет доступа, но я могу 'не могу понять, как исправить мой код.Кроме того, я почти уверен, что проблема вызвана initializeList, потому что, если я удаляю ее и вручную инициализирую каждый элемент списка, программа работает без сбоев.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Извините всех, моя вина.Я пытался понять это так долго, и теперь, после 5-минутного перерыва, я вижу, что, поскольку мой список не был инициализирован, а элементы не были связаны друг с другом, я не мог запустить последовательныйпросканируй это.Опять же, моя вина, я все еще новичок, у меня есть чему поучиться :)

0 голосов
/ 28 октября 2018

На самом деле в этом есть ошибка:

    l_p->value=rand()%999;
    l_p=l_p->next;

Вы не выделили память для l_p, а затем попытались присвоить значение в ограниченной области, ведущее к ошибке сегментации.

Вы можете попробовать это

void initializeList(struct entry *l_p)
{
    l_p=(struct entry *)malloc(sizeof(struct entry));
    l_p->next=NULL;
    struct entry *pointer,* back=l_p;
    for(int i=0;i<5;i++)
    {
        pointer=(struct entry *)malloc(sizeof(struct entry));
        pointer->next=NULL;
        back->next=pointer;
    }
    for(int i=0;i<6;i++)
    {
        l_p->value=rand()%999;
        l_p=l_p->next;
    }
}

Я создал 6 узлов и соединил их в первых 9 строках.

Затем назначил значения каждому из них в следующих строках.

...