为何程序在将NULL赋值给指针时崩溃?附栈实现代码
问题分析与解决方案
嘿,我来帮你排查这个崩溃问题!你遇到的核心问题其实是对指针的使用逻辑搞混了,咱们一步步拆解清楚:
崩溃的直接原因:解引用未初始化的野指针
你的类里traverser是int*类型的指针变量——它本身存储的是一个内存地址,而不是具体的数值。如果直接写*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




