You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何程序在将NULL赋值给指针时崩溃?附栈实现代码

问题分析与解决方案

嘿,我来帮你排查这个崩溃问题!你遇到的核心问题其实是对指针的使用逻辑搞混了,咱们一步步拆解清楚:

崩溃的直接原因:解引用未初始化的野指针

你的类里traverserint*类型的指针变量——它本身存储的是一个内存地址,而不是具体的数值。如果直接写*traverser = nullptr;,这是在尝试给traverser当前指向的内存位置赋值,但此时traverser还没被初始化,它的值是随机的野指针,解引用野指针必然会触发非法内存访问,直接导致程序崩溃。

你真正想要做的应该是把指针变量traverser本身设置为空指针,也就是把赋值语句改成:

traverser = nullptr; // 去掉前面的星号!

构造函数的正确实现示例

结合你的栈类设计,带参构造函数需要先完成底层数组的内存分配,再正确初始化指针。这里给你一个符合栈逻辑的实现参考:

STACK::STACK(int userIN) {
    height = userIN; // 假设userIN是栈的最大容量
    base = new int[height]; // 分配栈的底层存储数组
    traverser = nullptr; // 初始化遍历指针为空(或者根据逻辑指向base,下面会说)
}

额外优化建议(避免后续踩坑)

如果你的traverser是用来标记栈顶位置的,初始空栈状态下,把它指向base - 1会更方便后续push/pop操作,不用额外判断空指针:

STACK::STACK(int userIN) {
    height = userIN;
    base = new int[height];
    traverser = base - 1; // 空栈时,栈顶指针在栈底前一位
}

// 对应的push实现
void STACK::push(int val) {
    // 先检查栈是否已满
    if (traverser - base + 1 >= height) {
        printf("栈已满,无法入栈!\n");
        return;
    }
    *++traverser = val; // 先移动指针,再赋值
}

// 对应的pop实现
int STACK::pop() {
    // 检查栈是否为空
    if (traverser < base) {
        printf("栈已空,无法出栈!\n");
        return -1; // 或者抛出异常,根据需求调整
    }
    return *traverser--; // 先取值,再移动指针
}

另外别忘了在析构函数里释放内存,避免泄漏:

STACK::~STACK() {
    delete[] base;
    base = nullptr;
    traverser = nullptr;
}

总结

*traverser = nullptr;改成traverser = nullptr;就能解决当前的崩溃问题。同时建议结合栈的实际操作逻辑,合理初始化traverser的位置,这样后续的push/pop操作会更顺畅。

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

火山引擎 最新活动