之前做ACM题目时偶尔会出现段错误。段错误,之前也讲过,主要是内存的越界访问;但今天遇到的段错误的原因有些特殊,就是C++中的string类型也会引起段错误!!

先看源代码:

#include <iostream>
#include <string>
#include <cstdio>
#include <memory.h>
using namespace std;struct Heap
{string msg;//char msg[10]; 这里是根源!!!int param,prio;
} heap[60010];//下滑操作
void siftDown(int start,int end)
{//将start号结点向下调整直到endint i=start,j=2*i;heap[0]=heap[i]; //用heap[0]来临时保存i结点的值while(j<=end){//有右孩子并且右孩子比左孩子小时,或者当优先级相同并且j号结点后出现时将j保存右孩子if(j<end&&heap[j].prio>heap[j+1].prio) ++j;//比j号结点小时,不需调整if(heap[0].prio<=heap[j].prio)  //使其满足优先级相同时先到的先服务break;else{//向下调整heap[i]=heap[j];i=j;j=2*j;}}heap[i]=heap[0];
}//向上调整的函数
//将结点start调整到根结点1为止
void siftUp(int start)
{int j=start,i=j/2;heap[0]=heap[j];while(j>0){if(heap[i].prio<=heap[0].prio)break;else{//向上调整工作heap[j]=heap[i];j=i;i=i/2;}}heap[j]=heap[0];
}//插入操作的实现
bool insert(int& num,Heap& temp)
{if(60000==num) return false;++num;heap[num]=temp;siftUp(num);return true;
}//删除操作
bool removeMin(int& num,Heap& temp)
{if(0==num)return false;//将根的信息通过参数返回temp=heap[1];heap[1]=heap[num]; //填补树根--num;siftDown(1,num); //将根结点下滑到尾部return true;
}int main()
{char requ[4];int num=0;int para=0,pri=0; //para表示消息的参数,pri表示优先级memset(heap,0,sizeof(heap));while(cin>>requ){Heap hTemp;if(!strcmp(requ,"GET")){if(!removeMin(num,hTemp))printf("EMPTY QUEUE!\n");elsecout<<hTemp.msg<<" "<<hTemp.param<<endl;}else{cin>>hTemp.msg>>hTemp.param>>hTemp.prio;insert(num,hTemp);}}
}

重点是在结构体Heap中,当我将Heap中的成员msg由字符数组类型改为string类型时就会出现段错误,改回来时就AC。 这可能是由于编译器对C++所支持的标准不一样造成的,有些编译器可能对string类型支持的不是很好(包括之前用C++的类来做ACM题时也有段错误);而编译器对C语言支持的标准基本一致,所以做ACM题目时应尽量用C的语法或标准来做题,避免因编译器的不同导致一些看起来无法理解的错误。

ACM zoj 2724(堆实现 发现段错误)相关推荐

  1. ROS/c++常见段错误以及排查

    0. 前言 在C++编程中,我们经常会发现段错误这类问题,而这类问题经常是指访问的内存超出了系统所给这个程序的内存空间.一般是随意使用野指针或者数组.数组越界等原因造成的.段错误是指访问的内存超出了系 ...

  2. 段错误、内存泄漏、内存溢出、堆溢出、栈溢出

    参考:内存泄漏.内存溢出.段错误.堆溢出.栈溢出 作者:焦木白 发布时间:2019-10-22 网址:https://blog.csdn.net/jiaomubai/article/details/1 ...

  3. 内存泄漏、内存溢出、内存越界、段错误、堆溢出、栈溢出

    内存泄露 内存泄漏(memory leak)是应用程序分配某段内存后,由于疏忽或者错误,失去了对该段内存的控制,因而造成了内存的浪费. 或者可以说向系统申请分配内存进行使用(new),但是用完后不归还 ...

  4. linux 下 C 编程和make的方法 (十、C版的try catch 捕捉段错误和异常处理)

    2019独角兽企业重金招聘Python工程师标准>>> 哇塞,C语言有try catch吗?当然没有.倒..可能有人说了,那你野鬼说没有的东西做什么. 这里需要重申一下,所谓正向设计 ...

  5. linux read函数段错误,linux C++ 莫名奇异的段错误(segmentation fault),无法调用其他函数...

    进来在linux下开发C++项目,遇到了非常奇怪的bug. 项目须要多线程实现,在写好代码后,每当执行到线程函数内部,当内部调用其他函数如printf.fopen等时就会提示段错误(segmentat ...

  6. C 总线错误 (bus error) - 段错误 (segmentation fault)

    C 总线错误 (bus error) - 段错误 (segmentation fault) 两个常见的运行时错误: bus error (core dumped) - 总线错误 (信息已转储) seg ...

  7. 模糊测试:如何自动创建复杂的测试用例并发现未知错误

    作者 | Fabien Duchene 译者 | Sambodhi 据 Wikipedia 介绍,模糊测试 (fuzz testing, fuzzing)是一种软件测试技术,其核心思想是将自动或半自动 ...

  8. 什么是core dump linux下用core和gdb查询出现段错误的地方

    什么是core dump   linux下用core和gdb查询出现"段错误"的地方 http://blog.chinaunix.net/uid-26833883-id-31932 ...

  9. Linux 段错误详解

    1 背景 笔者早年写过一篇:<可恶的"Segmentation faults"之初级总结篇>,网络转载甚多.多年下来,关于段错误的讨论依旧很热烈,该问题也还是很常见.所 ...

最新文章

  1. 简述Field,Attribute,Property的区别
  2. python查找文件夹下的文件,python 查找文件夹下所有文件 实现代码 -电脑资料
  3. 024_jdbc-mysql的Dao模式
  4. 在浏览器上浏览vue项目,后退按钮是可以正常返回上一页的,但打包成app后,点击手机上的物理返回按钮就直接退出app回到桌面...
  5. 51nod 1267 4个数和为0
  6. 2434: [Noi2011]阿狸的打字机
  7. emlog评论ajax,Emlog评论通过QQ获取昵称资料
  8. ActiveMQ专题2: 持久化
  9. 论文阅读笔记二十八:You Only Look Once: Unified,Real-Time Object Detection(YOLO v1 CVPR2015)...
  10. [转载] 详细介绍Python函数中的默认参数
  11. 利用openssl进行base64的编码与解码
  12. 《符号学:原理与推演》引论
  13. 颜值大比拼,用数据告诉你中国哪里美女多?
  14. Ubuntu20.04安装Mysql(亲测有效,一定要按步骤来)
  15. 《Ivor Horton's Beginning Java》 Chapter1-7 读书笔记
  16. bilibili level up
  17. 什么是护网(HVV)?需要什么技能?
  18. 膨胀珍珠岩板(EPB) 保温材料英国UKCA 认证-EN 13169
  19. 软件测试常见中英文对照表
  20. python登录微信获取好友群生成列表

热门文章

  1. 数据结构-day2-栈(先进后出)和队列(先进先出)-C/C++
  2. Python-openpyxl对excel取消/合并单元格,以及修改单元格值
  3. 有人用Python写了个自动亏钱脚本,还能微信实时通知!
  4. 1.1 关于emscripten
  5. P1533 可怜的狗狗 平衡树
  6. 浅谈:平面设计修炼之道
  7. 使用python和flask建个人博客---如何用给网站绑定域名
  8. 第十三篇、文本框、密码框和文本域。
  9. 中国光学十大进展|每秒4万亿帧相机,把光拍成黑客帝国子弹
  10. 实验二 逻辑斯蒂回归