void main()是错误的

       USE_NET新闻组一直苦恼于一个问题的讨论,我们能否用void作为一个main的返回类型,ANSI标准说不能,然而,大量的关于C的启蒙书中的例子都使用了void main (void),这让许多人感觉不知该如何是好。

        当有人问为什么使用void是错误的时候,(即使它能正常工作),回答往往是下面中的一个:

因为标准这么说(这种回答通常是针对这这种问题"它能正常工作!")
因为调用main()的启动程序可以被认为是入栈,如果main()不这么做,在程序退出时将导至stack corruption的问题,并且 引发冲突。(这种回答通常是针对这这种问题"它能正常工作!")
因为你可能给调用环境返回一个随机值,这是很糟糕的,因为如果有人想要检测你的程序是否失败了,或者从一个makefile中调用你的程序,那么它们将不能保证非零的返回值就是失败。(这样的回答通常是针对这种问题"那是他们的问题")。
       这里我们举一个系统的例子去证明void main(void)程序在上面第三条里将要引起的问题。从一个脚本调用程序可能引起脚本的崩溃。不管它的返回码是否被检测到。从一个makefile调用它可能引起make的问题。从命令行调用它可能引起一个错误报告。

       RISC OS 是一种本地的操作系统,这个系统的方便之处是有一个系统变量Sys$RCLimit.这个变量的值是用来指定一个程序可以返回到系统的最大值,这个变量的默认值被系统设置为256.我不能确认这个变量的目的,但是它是确定存在的。

       现在,让我们看一个用int main(void)的例子程序

       int main(void)

       {

               return 42;

       }

 

       把它翻译成汇编语言,用gcc(Acorn自己的C编译会报告一个警告,并把它转换成一个返回值为0的整型函数):

|main|:
        mov     ip, sp 
        stmfd   sp!, {rfp, fp, ip, lr, pc}
        sub     fp, ip, #4
        cmps    sp,sl
        bllt    |x$stack_overflow|
        bl      |___main|

        mov     r0, #42
        ldmdb   fp, {rfp, fp, sp, pc}^

 

        第六个指令是初始化和堆栈检测,最后两个返回42到库的启动码,所以main的返回值被传递到R0.标记库启动码将要去调用一个整型的返回函数,所以能够使用R0的返回值。

        void main function发生了什么?好的,这儿是一个例子。

       #include <stdio.h>

       char buf[1024];
       void main(void)
       {
             (void)fgets(buf, 1024, stdin);
        } 

        程序在他的标准输入端口等待一行文本的输入,我们把它编译成汇编语言:   |.LC0|:
        dcd     |__iob|
|.LC1|:
        dcd     |buf|
|main|:
        mov     ip, sp 
        stmfd   sp!, {rfp, fp, ip, lr, pc}
        sub     fp, ip, #4
        cmps    sp,sl
        bllt    |x$stack_overflow|
        bl      |___main|

        ldr     r2, [pc, #|.LC0| - . - 8]
        mov     r1, #1024
        ldr     r0, [pc, #|.LC1| - . - 8]

        bl      |fgets|

        ldmdb   fp, {rfp, fp, sp, pc}^

        area    |buf|, DATA, COMMON, NOINIT
        %       1024        第六个指令是启动,下面的三个为fgets的调用设置参数,那么我们调用fgets并且返回到调用者。stdio.h中说fgets返回一个指针到缓存,所以,在这个实例中,我们返回到库启动码的是一个指向buf的指针,在RISC OS中,所有C程序被映射到内存地址0x8000.所以,我们将返回一个 > 32768 的值到操作系统中,(因此,大于Sys$RCLimit默认的值).系统产生错误。

       这儿是编译和运行程序的结果:

        SCSI: void % gcc void.c -o void
        Drlink AOF Linker  Version 0.28  30/07/95
        SCSI: void % show Sys$RCLimit
        Sys$RCLimit : 256
        SCSI: void % void
        I enter this line
        Return code too large
        SCSI: void %
        And, in a script file:

        SCSI: void % cat script

        void
        echo Finished

        SCSI: void % run script
        I enter this line
        Return code too large
        SCSI: void %   

        在第二个命令运行之前,错误中断了程序        

        注意,上面的例子是一个小的人为的目的去使最终函数调用返回一个指针。一个更好的例子是程序用printf:        

string > 256时也会返回错误,依赖用户输入字符的长度,程序是否可能返回一个错误在于用void作为main类型的返回

所以,如果你想要你的软件更有笑,请让main返回int,这样会做的更好。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jia_xiaoxin/archive/2008/08/25/2826868.aspx

转载于:https://www.cnblogs.com/javaTest/archive/2010/05/14/2589543.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zTree 优秀的jquery树插件

zTree 优秀的jquery树插件,文档详细&#xff0c;渲染快 使用方法&#xff1a; 1、引用zTree的js和css文件   <link href"~/Content/zTree_v3/css/zTreeStyle/zTreeStyle.css" rel"stylesheet" /><script src"~/Content/zTree_v3/js/jque…

执行点击事件,第一次点击后,一切正常,第二次点击,执行两次,以此类推

今天执行点击事件的时候&#xff0c;第一个点击正常&#xff0c;第二次点击接口调用了两次&#xff0c;第三次点击接口调用了3次。。。。我还以为是我的push数组写错了&#xff0c;后来发现是因为jq绑定一个按钮click事件的问题。 1.在点击事件上面添加了一行代码**$(’#btn’)…

牛客 2B 树 (组合计数)

传送门 大意: 给定n节点树, 求划分为不超过$k$个连通块的方案数. n,k<300. 核心观察是每个连通块深度最低的点固定以后染色方案就固定了. 所以答案为$\sum\limits_{i1}^k\binom{k}{i}i!\binom{n-1}{i-1}$ 转载于:https://www.cnblogs.com/uid001/p/10864775.html

Java中的42行代码中的URL缩短服务— Java(?!)Spring Boot + Redis

显然&#xff0c;编写URL缩短服务是新的“ Hello&#xff0c;world&#xff01; ”在IoT /微服务/时代的世界中。 一切始于在45行Scala中的URL缩短服务 -整洁的Scala&#xff0c;以Spray和Redis进行调味以进行存储。 随后&#xff0c; 在35行Clojure中使用了url缩短服务&#x…

poj 3256(DFS)

http://acm.pku.edu.cn/JudgeOnline/problem?id3256 题意&#xff1a;有k头牛&#xff0c;n个牧场&#xff0c;m条路&#xff08;每条路相连两个牧场且单向&#xff09;&#xff0c;求全部牛都能到达的牧场有几个。 分析&#xff1a;用DFS&#xff0c;从每头牛所在牧场开始&am…

jquery常用表单操作

//js将表单序列化成对象$.fn.serializeObject function () {var $els $(this).find("[name]");var formData {};var len $els.length;for (var i 0; i < len; i ) {var $item $($els[i]);var name $item.attr("name");var type $item.attr(&qu…

Android 小項目之---Iphone拖动图片特效 (附源码)

曾经被Iphone用手指在屏幕上滑来滑去拖动图片的操作方式吸引吗&#xff1f;在Android里头&#xff0c;这并不是什么难事。 所需要的技术点如下&#xff1a;Android.content.Context 、Android.widget.BaseAdapter、Android.widget.ImageView等通常会用在设计相册、 图片类型的选…

jq绑定的事件不生效

不知道什么原因&#xff0c;写了一段代码之后&#xff0c;绑定的所有的jq事件都不生效了。后来百度了一下&#xff0c;这里列出一种方法。 转载&#xff1a;https://www.jb51.net/article/46666.html $("#ceshisub").bind("click",function(){ var a1; …

Python笔记_第三篇_面向对象_6.继承(单继承和多继承)

1. 概念解释&#xff1a; 继承&#xff1a;有两个类&#xff1a;A类和B类。那么A类就拥有了B类中的属性和方法。 * 例如&#xff1a;Object&#xff1a;是所有类的父亲&#xff0c;还可以成为基类或者超类&#xff08;super()&#xff09; * 继承者为子类&#xff0c;被继承者成…

文本内容之间的关键词提取和相似度计算

背景 Web应用程序变得越来越智能。 从网站上使用服务的日子已经一去不复返了&#xff0c;用户不得不填写一个巨大的表格。 假设您有一个适合书迷的网站。 在Web 2.0之前&#xff0c;此类网站曾经以诸如年龄&#xff0c;阅读书籍&#xff0c;喜欢的书籍类型&#xff0c;语言偏好…

Windows XP SP3支持多用户远程桌面连接

远程桌面连接的确很方便&#xff0c;但是在Windows XP中只支持单一用户的连接&#xff0c;当第二个用户连接时&#xff0c;第一个用户就被迫断开并回到用户登录界面了&#xff0c;这可和多任务的操作系统理念不符啊&#xff0c;或许微软是为了突出Server系统的特点吧&#xff0…

构建用于测试的超大型内存InputStream

由于某种原因&#xff0c;我需要非常大的&#xff0c;甚至可能是无限的InputStream &#xff0c;它会反复地反复返回相同的byte[] 。 这样&#xff0c;我可以通过重复小样本来产生大量的数据流。 在Guava中可以找到类似的功能&#xff1a; Iterable<T> Iterables.cycle(I…

linux 调试小经验

1、查看netlink socket 丢包 cat /proc/net/netlink sk Eth Pid Groups Rmem Wmem Dump Locks Drops Inode c91eda00 0 1172 00000001 0 0 00000000 2 0 27767 c43eee00 0 -4099 00000000 0 0 00000000 2 0 41200 c9266e00 0 1186 00000000 0 0 00000000 2 0 28922 c1af580…

前端打印功能

方法一&#xff1a; html代码&#xff1a; 在要打印的内容上加入&#xff1a;<!--startprint-->和<!--endprint--> js代码&#xff1a; $(.printData).click(function(){bdhtmlwindow.document.body.innerHTML; sprnstr"<!--startprint-->"; …

Vlc支持IE 360 低版本的Google浏览器

VLC 插件代码&#xff1a; <object typeapplication/x-vlc-plugin pluginspage"http://www.videolan.org/" idvlc eventsfalse width"720" height"410"><param namemrl valuertsp://admin:123456******:554/h264/ch1/main/av_stream /&…

同步多线程

同步多线程&#xff08;SMT&#xff09;是一种在一个CPU 的时钟周期内能够执行来自多个线程的指令的硬件多线程技术。本质上&#xff0c;同步多线程是一种将线程级并行处理&#xff08;多CPU&#xff09;转化为指令级并行处理&#xff08;同一CPU&#xff09;的方法。 同步多线…

如何使用布隆过滤器在Java中建立大容量的内存缓存

背景 缓存是解决日常软件问题的重要概念。 您的应用程序可能会执行CPU密集型操作&#xff0c;而您又不想一次又一次地执行这些操作&#xff0c;而是只导出一次结果并将其缓存在内存中。 有时瓶颈是IO&#xff0c;例如您不想重复访问数据库&#xff0c;并且想缓存结果并仅在基础…

Centos7安装Python3的方法

由于centos7原本就安装了Python2&#xff0c;而且这个Python2不能被删除&#xff0c;因为有很多系统命令&#xff0c;比如yum都要用到。 [rootVM_105_217_centos Python-3.6.2]# python Python 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)…

ajax请求导致status为canceled的原因

在使用layui的form表单提交以后&#xff0c;请求状态总是canceled。后来在form表单的后面添加了一行代码&#xff1a; return false; 就可以了。 文档&#xff1a;https://www.layui.com/doc/modules/form.html#onsubmit 错误&#xff1a; 解决方法&#xff1a; 总结一下&…

CSS图片水平垂直居中

Html: <div id"MainContent"><img src"QQ截图20150515140512.png" width"247" height"192"></img></div></div> CSS: #MainContent {display:table-cell;width: 700px;height: 800px;background: #0C78…