给 栈底分配内存时直接结束,程序运行到malloc为什么突然结束,以前没发生过啊,不知道是哪里出了问题,能给出指点吗
程序运行到malloc为什么突然结束,以前没发生过啊,不知道是哪里出了问题,能给出指点吗
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- include_iostream_ 2021-10-09 23:42关注
这段代码你犯了至少两个错误。
第一,第13行,你的s没有初始化。这导致你的程序的s实际上是一个野指针,试图访问野指针指向的对象的成员就会得到段错误,因为s本身的内存还没有得到正确分配。(你程序中第14行分配的是s->base的内存,但由于你的s是指针,你还需要分配s的内存,这两件事不能混为一谈。)
第二,你的代码并不能指出malloc这行没有执行成功(虽然这个例子下确实是malloc这行导致,但这只是巧合而已)。printf默认是行缓冲,当你的程序触发SIGSEGV(段错误信号)时标准库直接terminate掉进程,你的printf实际上不能指示程序的异常终止位置,因为这种异常终止的情形下,printf的输出行为并不会真正触发。printf实际触发输出的时机有两种:一是内部缓冲区满(积累了较多的东西等待输出),二是强制输出逻辑(遇到回车会触发强制输出,调用fflush函数会起到相同的作用)。
你需要把第13行改成:sqStack s = (sqStack)malloc(sizeof(sqStack));
最后再提一个题外话:看来你在读严蔚敏《数据结构》。我们这些工程师都极其不推荐这本书,因为太过古老而且可实践性较差,使用的C语言malloc实际上妨碍了初学者关注算法核心逻辑,而且严书中的实现其实相当ugly,一点也不优雅。我们一般会通过刷题网站、网络博客、网课等入门数据结构,事实上我身边只有竞争力较差的学校的考研学生会为了应试读严书,我认识的优秀工程师中没有一位是从严书入门的。此外,严书由于某些实现相当诡异,充斥着上世纪的落后做法的痕迹,很多地方实际上反而加大了初学者阅读和理解的难度。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 基与机器学习和时间序列分析预测养老服务需求趋势
- ¥100 求连续两帧图像在水平和垂直上偏移
- ¥15 mysql全文索引查找指定必须关键词word无效
- ¥15 Verilog hdl密码锁设计
- ¥35 基于python的有ssl加密传输的socket聊天室
- ¥15 数码管亮度控制器设计
- ¥15 kafka客户端跨网段访问,看日志提示连接的还剩内网地址,且访问不通
- ¥15 关于c语言代码的问题
- ¥15 c51单片机控制步进电机
- ¥20 Visual studio无法检测到设备