You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言栈代码报错Process returned -1073741819 (0xC0000005)求助

问题排查与解决:栈实现中的内存访问错误(0xC0000005)

首先,咱们直接定位核心问题:你的main函数里对栈指针的初始化方式完全错误,导致了非法内存访问,这就是触发Process returned -1073741819 (0xC0000005)错误的根本原因。

错误分析

看main里的这段代码:

stack *s;
initStack(&s);
  • 你声明了stack *s,这是一个指向stack结构体的指针,但它没有被初始化,是个野指针,指向的是随机内存地址。
  • 然后你调用initStack(&s),但initStack的参数是stack *s(期望接收一个stack结构体的指针),而你传的是stack **s(指针的指针,也就是main里那个野指针的地址)。
  • 进入initStack后执行s->top = -1;,这时候的s实际上指向的是main里的stack *s这个指针变量本身,而不是一个有效的stack结构体。修改这个内存区域的内容属于非法访问,直接触发了内存访问违规错误。

另外,虽然你怀疑是数组越界,但实际上在这个错误触发后,后续的push操作根本没机会执行到数组越界的步骤——程序在initStack的时候就已经崩溃了。

两种修复方案

方案1:使用栈结构体变量(推荐,简单直接)

把main里的指针声明改成结构体变量,然后传递它的地址给各个栈操作函数:

int main(){
    stack s; // 声明栈结构体变量,而非指针
    initStack(&s);
    push(&s, 19);
    push(&s, 2);
    push(&s, 19);
    push(&s, 2);
    push(&s, 19);
    printStack(&s);
    return 0;
}

这样&s是stack *类型,和initStack、push等函数的参数类型完全匹配,initStack里的s->top = -1;会正确修改结构体变量s的top成员,后续的push操作也能正常访问info数组,不会有问题。

方案2:使用动态分配的栈指针

如果一定要用指针实现,需要先给指针分配内存,然后直接传递指针给函数:

int main(){
    stack *s = (stack*)malloc(sizeof(stack)); // 分配栈结构体的内存
    if(s == NULL){ // 记得检查内存分配是否成功
        printf("Memory allocation failed!\n");
        return 1;
    }
    initStack(s); // 直接传指针,而非&s
    push(s, 19);
    push(s, 2);
    push(s, 19);
    push(s, 2);
    push(s, 19);
    printStack(s);
    free(s); // 释放分配的内存,避免内存泄漏
    return 0;
}

这种方式需要注意内存分配失败的检查,以及使用完后释放内存。

验证修改后的效果

修改后运行程序,输出应该是:

19 2 19 2 19 

完全符合预期,不会再出现内存访问错误,而且你的栈逻辑本身是正确的——top从-1开始,push五次后top等于N-1(4),刚好填满栈,没有数组越界的问题。

额外注意点

  • C语言里函数参数的类型匹配非常重要,不匹配的指针类型会导致诡异的内存错误,一定要仔细核对。
  • 0xC0000005错误通常和野指针、空指针解引用、数组越界、非法内存访问相关,遇到这类错误优先检查指针初始化和内存操作的合法性。

内容的提问来源于stack exchange,提问作者user12102400

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:32:28