当我创建链表循环时,CodeBlocks 给出 "Process returned -1073741819 (0xC0000005)",0 错误和 0 警告

CodeBlocks gives "Process returned -1073741819 (0xC0000005)", with 0 error nd 0 warning when I create a linked list cycle

当我使用 Code::Blocks 时,我想创建一个双向链表。

并且我想用数组来创建类型为struct*的节点。

我怀疑这就是错误的来源。

而且我也不知道:如果我给一个变量N来创建一个[N],会不会出错?

并且编译器给了我 0 个错误和 0 个警告的结果,但是它 returns -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", &N, &A, &B, &K);

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

作为@Eugene Sh。说,a[]是一个未初始化指针数组。
所以我添加了

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

它现在运行
所以我看到,如果我给一个变量N来创建一个[N],它不会错。
并返回-1073741819(0xC0000005)可能是没有给指针放置位置的问题,
或不初始化指针。

您正在构建 a[]

那么您正在分配不存在的垃圾数据值,这将导致未定义的行为。然后 auto 变量 a[] 超出范围,如果它没有崩溃,你只是在内存中写入了一些随机位置并 returned 了一个未初始化的值。通过 malloc 初始化指针,这个程序表现得更好,

这将 return 指向 a[1] 的指针,所有其他值都是内存泄漏,因为当函数 [=53] 时 a 的所有其他值都超出范围=]秒。您可能正在寻找这样的东西,

您可以通过在创建指针后立即初始化指针来实现。您实际上根本不需要 a[],您可以通过使用指向 struct ListNode:

的指针就地执行此操作
  • 保持 head 为 0;
  • tail 是您构建的最后一个;
  • before_tail link 最多 tail;
  • 完成后,link tailhead 完成循环。