#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[]
как таковой,
затем вы присваиваете несуществующие значения данных мусора, что приведет к неопределенному поведению. Затем auto
переменная a[]
выходит за рамки, и если она не разбилась, вы просто записали какое-то случайное место в памяти и вернули неинициализированное значение. С malloc
инициализацией указателей эта программа ведет себя намного лучше,
Это вернет указатель на 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), возможно, проблема в том, чтобы не указывать место указателю
или не инициализировать указатель.