CodeBlocks创建循环链表运行返回0xC0000005无编译报错求助
错误原因梳理
- 关于
ListNode* a[N]的写法:该写法属于C99标准引入的变长数组(VLA)特性,只要编译器兼容C99及以上标准就可以正常编译,不属于本次崩溃的核心诱因。但变长数组在栈空间分配,N取值较大时存在栈溢出风险,生产环境更推荐用malloc在堆上分配指针数组。 - 运行错误码
0xC0000005对应内存访问违例,由以下多个问题共同触发:- 野指针访问:你定义的
a是指针数组,每个元素都是ListNode*类型的指针,但你没有为任何指针分配实际的ListNode结构体内存,直接通过->访问成员属于操作野指针,直接触发内存访问错误。 - 数组下标越界:C语言数组下标从0开始计数,
a[N]的合法下标范围为0 ~ N-1,你代码中直接访问a[N]属于越界访问,会篡改栈上其他内存数据。 - 局部栈内存非法引用:
a是makecycle函数内的局部栈变量,函数执行结束后对应的栈空间会被系统回收,你返回的a[1]指向的内存后续会被其他数据覆盖,在main函数中操作该指针同样会触发未定义行为。 - 遍历逻辑错误:你构造的是循环链表,
head永远不会为NULL,main中的while(head)遍历逻辑会进入死循环。
- 野指针访问:你定义的
修复代码示例
#include <stdio.h> #include <stdlib.h> // 定义链表节点 typedef struct ListNode { int val; struct ListNode* next; }ListNode; // 构造循环链表 ListNode *makecycle(int N) { int i; // 分配N+1个指针元素,适配1~N的下标习惯 ListNode** a = (ListNode**)malloc(sizeof(ListNode*) * (N + 1)); // 为每个节点分配实际结构体内存 for(i = 1; i <= N; i++) { a[i] = (ListNode*)malloc(sizeof(ListNode)); } for(i = 1; i < N; i++) { a[i]->next = a[i+1]; a[i]->val = i; } a[N]->next = a[1]; a[N]->val = N; ListNode* head = a[1]; // 释放指针数组的内存,节点内存已经在堆上分配不会被回收 free(a); return head; } int main() { int N, A, B, K; scanf("%d %d %d %d", &N, &A, &B, &K); ListNode *head = makecycle(N); ListNode *cur = head; // 循环N次输出所有节点,避免死循环 for(int i = 0; i < N; i++) { printf("%d ", cur->val); cur = cur->next; } // 补充:链表使用完后需要遍历释放所有节点内存,避免内存泄漏 return 0; }
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

