1.问题发现
  有这样一段代码:
  #include <stdio.h>
   int main()
   {
      int a, b, num1, num2, temp;
      printf("please input two numbers:\n");
      scanf("%d,%d", &num1, &num2);
      if(num1 > 0 && num2 > 0) (1)
      {
         a = num1;
         b = num2;
         temp = a%b;
      }
      while(b != 0) (2)
      {
         a = b;
         b = temp;
         temp = a%b;
      }
      printf("gong yue shu : %d\n", a);
      printf("gong bei shu : %d\n", num1*num2/a);
      return 0;
   }
  该代码输入任何数字的执行结果(如图1)都是“浮点数异常(核心已转储)”,刚刚见到这个问题让人感觉摸不着头绪,程序根本没有用到浮点数,怎么会报告浮点数异常;
  
  图1.程序运行结果
  
2.问题分析
  
  下面我们通过Linux自带调试工具Gdb来进行调试,观察程序的运行状况。在编译的是个加上“-g”选项,方便利用Gdb调试。

  
  图2.编译和调试指令
  
  程序编译没有错误,下面使用Gdb工具调试;在不知道问题产生根源的情况下,先在(1)处设置断点,全速运行;
  
  
  图3.断点之前运行情况
  从图3可见,进入断点前,程序运行正常;下面查看变量num1、num2的值。
  
  
  图4.变量赋值情况
  
  由图4可见,变量num1、num2的值正常读入。下面将断点设置在(2)处,全速运行。
  
  
  图5.进入断点2前程序运行情况
  
  由图4可见,进入while循环之前,程序正常运行。查看变量a、b赋值情况发现此时变量a、b均按照程序预期赋值。
  
  
  图6.变量a、b赋值情况
  
  下面开始单步运行。由图7可见,第一次循环结束变量a的值为4,b的值
  
  
  图7.第一次循环执行情况
  
为2,temp的值为0;继续单步运行。从图8可以看出,在第二次进入循环执行

  

  图8.第二次循环执行情况

语句“temp = a%b;”的时候出现了错误。分析变量值发现此时变量a的值为2,b的值为0,对0求余是没有意义的,语法不允许。到此,问题水落石出。
  现在,我们编写测试代码对问题产生原因进行验证,代码如下:
  
  #include <stdio.h>
  int main(int argc , char *argv[])
  {
     int a=5,b=0;
     printf("%d\n",a%b);
     return 0;
  }
  
  
  图9.测试代码运行情况
  
  由图9可见,该错误系求余运算符右边操作数为0值所致。如果把测试代码的“a%b”改为“a/b”,运行结果仍然是浮点数例外。求余运算和除法运算不允许右边的操作数为0值,我们在编写程序的时候需小心谨慎,注意程序的逻辑,避免之中错误的发生。问题代码系网上引用,其中辗转相除法的逻辑错误,此处不加讨论。

关于Linux系统下错误“浮点数异常(核心已转储)”的分析的更多相关文章

  1. Linux 下运行 C++ 程序出现 “段错误(核心已转储)”

    Linux下写C++程序出现“段错误(核心已转储)”的问题: 段错误一般就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它 ...

  2. Linux下运行C++程序出现"段错误(核心已转储)"的原因

    今天写程序出现了“段错误(核心已转储)"的问题,查了一下资料,加上自己的实践,总结了以下几个方面的原因. 1.内存访问出错  这类问题的典型代表就是数组越界. 2.非法内存访问 出现这类问题 ...

  3. Linux系统下到哪儿寻找硬件错误

    Linux系统下到哪儿寻找硬件错误       当linux系统出现故障的时候,作为管理员首先要定位错误,现在linux有许多工具都能帮助用户寻找错误,要学会利用他们确定问题.这些工具包括dmesg. ...

  4. 深入理解linux系统下proc文件系统内容

    深入理解linux系统下proc文件系统内容 内容摘要:Linux系统上的/proc目录是一种文件系统,即proc文件系统. Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它 ...

  5. 在Linux系统下运行微信Web开发者工具

    微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折. 注:带 * 的步骤或文件为不确定是否管用的步骤或文件.本人系统为Linux ...

  6. Vi (Unix及Linux系统下标准的编辑器)VIM (Unix及类Unix系统文本编辑器)

    Vi是Unix及Linux系统下标准的编辑器.学会它后,您将在Linux的世界里畅行无阻.基本上vi可以分为三种状态,分别是命令模式.插入模式,和底行模式. vi编辑器是所有Unix及Linux系统下 ...

  7. linux系统下的权限知识梳理

    下面对linux系统下的有关权限操作命令进行了梳理总结,并配合简单实例进行说明.linux中除了常见的读(r).写(w).执行(x)权限以外,还有其他的一些特殊或隐藏权限,熟练掌握这些权限知识的使用, ...

  8. linux系统下修改文件夹目录权限

    linux系统下修改文件夹目录权限 文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何 ...

  9. Linux系统下Apache2.4.17的安装过程

    Linux系统下安装Apache Server2.4.17.还是先声明一下,Linux命令我不进行讲解,因为我不是讲Linux命令的.有需要注意的地方,我会上图,没什么值得的注意的地方,我就不上图了. ...

随机推荐

  1. Tomcat使用详解

    Tomcat简介 官网:http://tomcat.apache.org/ Tomcat GitHub 地址:https://github.com/apache/tomcat Tomcat是Apach ...

  2. 【Kubernetes】K8S网络方案--最近在看的

    K8S网络-最近在看的 Create a Minikube cluster - Kubernetes Kubernetes Documentation - Kubernetes Kubernetes ...

  3. springmvc+mybatis事务回滚

    spring-mybatis.xml中 配置了 <!-- 拦截器方式配置事物 --> <tx:advice id="transactionAdvice" tran ...

  4. DevExpress 标题栏添加搜索功能

    上图是效果图 附件示例代码下载

  5. 在桌面程序上和Metro/Modern/Windows store app的交互(相互打开,配置读取)

    这个标题真是取得我都觉得蛋疼..微软改名狂魔搞得我都不知道要叫哪个好.. 这边记录一下自己的桌面程序跟windows store app交互的过程. 由于某些原因,微软的商店应用的安全沙箱导致很多事情 ...

  6. 安装VS2015历险记

    最近,因为一些需求,需要在家里的笔记本上安装VS2015.本来以为一件很容易的一件事,发现做起来遇到了很多坑. 首先,下载VS2015,这就花费了两三个小时,安装包太大了.下载完,安装.安装不成功,报 ...

  7. display用法:

    用法: 1.display:fixed: 存在于position定位top,left,right,bottom,fixed:脱离文档流的针对于浏览器窗口大小定位,可以更好的解决"缩小浏览器窗 ...

  8. 12.Java中Comparable接口,Readable接口和Iterable接口

    1.Comparable接口 说明:可比较(可排序的) 例子:按照MyClass的y属性进行生序排序 class MyClass implements Comparable<MyClass> ...

  9. EF不能很好的支持DDD?估计是我们搞错了!

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:最近在ABP项目中尝试纯粹的DDD,然后遇到EF实现的Repository似乎不能很好 ...

  10. Mac上自带的Apache介绍

    Mac 自动Apache,无须再安装,默认的Apache地址是: /private/etc/apache2 一. Apache基本操作 1. 启动:sudo apachectl start 2. 查看 ...