当我创建链表循环时,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
tail
到 head
完成循环。
当我使用 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
tail
到head
完成循环。