Кодовые блокировки дают «Процесс вернул -1073741819 (0xC0000005)», при этом 0 ошибок и 0 предупреждений при создании цикла связанного списка

#c #linked-list #codeblocks

Вопрос:

Когда я использую код::Блоки,я хочу создать двусвязный список.

И я хочу использовать массив для создания узлов, типом которых является struct*.

Я подозреваю, что именно отсюда и взялась ошибка.

И также я не знаю этого: если я дам переменную N для создания[N], будет ли это неправильно?

И компилятор выдает мне результат 0 ошибок и 0 предупреждений, но он возвращает -1073741819 (0xC0000005).

Вы знаете, где находится неправильное место? Заранее благодарю вас!

вот мои коды

 #include <stdio.h>
#include <stdlib.h>
//define a node
typedef struct ListNode
{
    int val;
    struct ListNode* next;
}ListNode;
//construct a linked list Cycle
ListNode *makecycle(int N)
{
    int i;
    ListNode* a[N]; //can I create an array using N?
    a[1]->next = a[2];
    a[1]->val = 1;
    for(i = 2; i < N; i  )
    {
        a[i]->next = a[i 1];
        a[i]->val = i;
    }
    a[N]->next = a[1];
    a[N]->val = N;
    return a[1];
}
//input needed variables
int main()
{
    int N, A, B, K;
    scanf("%d %d %d %d", amp;N, amp;A, amp;B, amp;K);

    ListNode *head = makecycle(N);
    while(head) {
        printf("%d ", head->val);
        head = head->next;
    }
}
 

Комментарии:

1. a[] представляет собой массив неинициализированных указателей.

2. так должен ли я выбирать от 1 до N?

3. Искренне благодарю вас. Я добавил значение для(i = 1; i

4. a[] это также auto переменная, она будет удалена, когда выйдет за рамки. Не то чтобы это имело какое-то значение, вам действительно нужен только указатель на первое и последнее значение.

5. 0xC0000005 является ли Windows эквивалентом ошибки сегментации Posix

Ответ №1:

Вы строите a[] как таковой,

a[]

затем вы присваиваете несуществующие значения данных мусора, что приведет к неопределенному поведению. Затем auto переменная a[] выходит за рамки, и если она не разбилась, вы просто записали какое-то случайное место в памяти и вернули неинициализированное значение. С malloc инициализацией указателей эта программа ведет себя намного лучше,

a[] с инициализированными значениями

Это вернет указатель на a[1] , а все остальные значения являются утечками памяти, поскольку все остальные значения a выходят за рамки, когда функция возвращается. Вы, вероятно, ищете что-то подобное,

Круговой связанный список.

Вы можете сделать это, инициализировав указатели вскоре после их создания. На самом деле вам это вообще не нужно a[] , вы могли бы сделать это на месте, используя указатели на struct ListNode :

  • держится head на 0;
  • tail быть последним, кого ты построил;
  • наличие before_tail связи с tail ;
  • когда вы закончите, перейдите по ссылке tail head , чтобы завершить цикл.

Комментарии:

1. Большое спасибо! Я понимаю, что массив структур не нужен. 🙂

Ответ №2:

как говорит @Eugene Sh., a[] это массив неинициализированных указателей.
поэтому я добавил

 for(i = 1; i <= N; i  )
 { 
    a[i] = (ListNode*)malloc(sizeof(ListNode));
 } 
 

и он работает сейчас
поэтому я вижу, что если я дам переменную N для создания[N], это не будет неправильно.
и возвращая -1073741819 (0xC0000005), возможно, проблема в том, чтобы не указывать место указателю
или не инициализировать указатель.