qq_52587679 2021-10-09 23:26 采纳率: 80%
浏览 40
已结题

程序运行到malloc为什么突然结束,以前没发生过啊,不知道是哪里出了问题,能给出指点吗

给 栈底分配内存时直接结束,程序运行到malloc为什么突然结束,以前没发生过啊,不知道是哪里出了问题,能给出指点吗

img

img

  • 写回答

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,一点也不优雅。我们一般会通过刷题网站、网络博客、网课等入门数据结构,事实上我身边只有竞争力较差的学校的考研学生会为了应试读严书,我认识的优秀工程师中没有一位是从严书入门的。此外,严书由于某些实现相当诡异,充斥着上世纪的落后做法的痕迹,很多地方实际上反而加大了初学者阅读和理解的难度。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月15日
  • 已采纳回答 12月7日
  • 创建了问题 10月9日

悬赏问题

  • ¥15 基与机器学习和时间序列分析预测养老服务需求趋势
  • ¥100 求连续两帧图像在水平和垂直上偏移
  • ¥15 mysql全文索引查找指定必须关键词word无效
  • ¥15 Verilog hdl密码锁设计
  • ¥35 基于python的有ssl加密传输的socket聊天室
  • ¥15 数码管亮度控制器设计
  • ¥15 kafka客户端跨网段访问,看日志提示连接的还剩内网地址,且访问不通
  • ¥15 关于c语言代码的问题
  • ¥15 c51单片机控制步进电机
  • ¥20 Visual studio无法检测到设备