精华内容
下载资源
问答
  • C语言主函数返回值含义

    万次阅读 2017-03-14 19:36:09
    上大学时候我学习C语言的时候主函数的类型还可以void类型,毕业之后想再次加深一下编程的水平发现我找的编译器居然要求主函数必须具有int类型的返回值。简单的看了一点教程以及网络上的介绍之后,也不管三七二十一...

           上大学时候我学习C语言的时候主函数的类型还可以用void类型,毕业之后想再次加深一下编程的水平发现我找的编译器居然要求主函数必须具有int类型的返回值。简单的看了一点教程以及网络上的介绍之后,也不管三七二十一直接照抄教程中的说明,主函数返回值写上一个return 0。可这到底什么意思呢?

           写一个常用的简单代码如下:

    #include"stdio.h"

     

    int main(void)

    {

           printf("test\n");

           return 0;

    }

           编译运行结果:

    E:\WorkSpace\01_编程语言\01_C语言\02_main_return_value>gcc test.c

     

    E:\WorkSpace\01_编程语言\01_C语言\02_main_return_value>a

    Test

           那再修改一下,返回值修改一下:

    #include"stdio.h"

     

    int main(void)

    {

           printf("test\n");

           return 1;

    }

           编译运行结果:

    E:\WorkSpace\01_编程语言\01_C语言\02_main_return_value>gcc test.c

     

    E:\WorkSpace\01_编程语言\01_C语言\02_main_return_value>a

    Test

           运行也没有问题。如此看来,这个返回值似乎可以随意一些。不过,今天看了一段程序之后倒是觉得这个却也不能够那么随意。示范代码改为如下:

    #include"stdio.h"

    #include"stdlib.h"

     

    int main(void)

    {

           printf("test\n");

           return EXIT_SUCCESS;

    }

           由此,看来最后一个返回状态还是有很多特殊的用途的。我查看了stdlib.h的头文件,找到了两个相关的宏定义如下:

    #defineEXIT_SUCCESS 0

    #defineEXIT_FAILURE 1

           由此看来,一般返回值为0的时候代表的是程序的一种正常状态,而返回值为1的时候则代表程序运行遇到问题失败。那么,换做其他的返回值是否有问题呢?在这个头文件中并没有找到其他的宏定义,因此只能够随意试一下了。修改代码如下;

    #include"stdio.h"

    #include"stdlib.h"

     

    int main(void)

    {

           printf("test\n");

           return 300;

    }

           代码改的有点随意,编译运行结果如下:

    E:\WorkSpace\01_编程语言\01_C语言\02_main_return_value>gcc test.c

     

    E:\WorkSpace\01_编程语言\01_C语言\02_main_return_value>a

    Test

         没有什么问题,看来这个返回值应该是大家形成共识作为一个参考参数的。而未定义的返回值则很难让人去琢磨你程序的运行状态。如此想来,如果没有什么特殊的需求最好是让程序能够正常结束,给出一个正常的状态。或者,加一个笼统一点的分支,在失败的时候给出一个运行失败的提示。

    展开全文
  • 我们打眼一看,其实很简单,就是引入头文件,写一个主函数,然后输出一句话,但是当我们编译出来ELF时候,我们使用工具readelf,去查看下这里面FUNC,会发现多了很多方法。(gcc相关工具链,我经常用的是objdump...

    我们在刚写程序的时候,第一个都是 hello world,而在这里,完整的代码就是:

     

    图片

     

    我们打眼一看,其实很简单,就是引入头文件,写一个主函数,然后输出一句话,但是当我们编译出来ELF的时候,我们使用工具readelf,去查看下这里面的FUNC,会发现多了很多方法。(gcc相关工具链,我经常用的是objdump )

     

    图片

     

    如果你想知道这个过程都处理了什么,可以使用gcc -o hello hello.c -v,这里的-v,会输出过程信息,这里截一部分,大家看下

     

    图片

     

    这块要学习,去GCC官方看下它的编译,链接参数。Makefile文件,可以使用 --just-print 进行调试。这里面的UND,代表的是未定义,未定义的这些方法,会在加载器加载的时候,补充进来。

     

    我们这里使用 IDA 来解析下这个输出ELF,可以看到一个简单的信息。

     

    图片

     

    这里的Interpreter,就是解析程序,crtstuff.c这个就是给我们的运行环境,做初始化。从这里我们就能看到,其实我们的一个简单的程序,也是五脏俱全的。

    广告

    程序员的自我修养:链接、装载与库(博文视点出品)

    作者:潘爱民,俞甲子,石凡

    京东

    既然它们的流程是,系统加载进来,然后初始化,再到我们的main方法,那么这个main方法,肯定是可以变的。为什么这么说呢?做过嵌入式开发的应该熟悉,基本上都没有main函数一说,直接从跳转入口开始跑就可以的。可以给任意函数,指定成Enter,也就是入口函数,使用链接脚本就可以指定,这块感兴趣的可以搜索gcc链接器参数。

     

    我们先简单做一个操作,这样子来处理下。gcc -o hello hello.c -nostdlib

    我们来把这个库去掉,看看会报哪些错误,可以看到这里报了入口点找不到,也就是_start 。

     

    https://my.oschina.net/saly/blog/130920 我们看下这里的参数介绍:

     

    图片

     

    我们是用gcc -o hello hello.c -nostartfiles 把这个启动函数去掉,然后我们自己实现一个。然后我们把文件修改成

     

    图片

     

    这里修改成exit ,同时加上对应的库文件,去掉return的原因是,这时候不能返回,需要清理,返回去没人接这个,系统中使用的是jmp,你返回就找不到路了。

     

    然后这里已经没有main函数了,直接用的_start,这个属于覆盖的方式,那么我们自己定义一个名字,该怎么处理呢?

     

    然后使用参数 gcc -o hello hello.c -nostartfiles -efuck_main  ,-e这里就是 -enter的缩写,代表指定入口,通过这个操作,最终我们实现了没有main函数的一个程序,并且能够运行。

     

    图片

     

    今天在这里分享一个比较有用的命令,在我们开发移植三方代码时候,会遇见很多未定义,包含错误,链接失败,这时候就需要定位我们的编译器参数,echo 'main(){}'|gcc -E -v - 这个可以看到详细的头文件,链接库的引用信息,当然我们可以使用--sysroot去指定,同时配合着 -I -l 参数。

     

    到这里就完了吗?必然不是,我们看了如何修改入口函数,我们如果想要在main前后做一些动作呢?我们晓得的是动态库是有这个机制的,我们静态可执行库,也是有的,具体是:

     

    图片

     

    这里运行结果:

     

    图片

     

    我们可以清晰的看到,前后有了输出,那么我们看下这个最终的elf,这里找到after_main具体存放位置,而这个对应位置的方法,会在调用main之后进行遍历。所以这个是可以声明多个的。

     

    图片

     

    而关于退出,还有个优雅的方式,就是int atexit(void (*)(void));,这个是一个设置退出方法,然后在main结束后,会进行执行,这里就是注册,很好理解。

     

    为什么有main函数,主要是约定成俗,你让别人用你的东西,那必然要给他一个入口,也就是你的系统跟他关联的那个定义,main函数就是c语言开发,大家约定的入口。

     

    但是在嵌入式开发当中,因为整个的系统,都是由我们处理,从启动,加载,运行,所以我们是可以不指定main函数,可以自己来约定。

     

    好了第一讲就分享到这里,下一节我们来说下,c语言main函数的多种写法,其中一个标准的写法是带有:参数argv和argc,下一节说下这个是如何查找,定位的。

    展开全文
  • 总体上必须清楚: 1)程序结构是三种: 顺序结构 , 循环结构(三个循环结构), 选择结构(if 和 switch) 2)用C语言编写程序称为C语言源程序,源程序文件后缀名为'.c“;源程序经编译后生成后缀名为'.obj“目标文件...

    总体上必须清楚的: 1)程序结构是三种: 顺序结构 , 循环结构(三个循环结构), 选择结构(if 和 switch) 2)用C语言编写的程序称为C语言源程序,源程序文件的后缀名为'.c“;

    源程序经编译后生成后缀名为'.obj“的目标文件;

    再把目标文件与各种库函数连接起来,生成'.exe“的可执行文件。

    3)main函数,又称主函数,每个C程序有且只有一个main函数;

    无论main函数在整个程序中的位置如何,程序总是从main函数开始执行、也从main函数结束。读程序时应从main函数开始, 然后从上往下读(碰到循环做循环,碰到选择做选择)。

    4)计算机的数据在电脑中保存是以 二进制的形式. 数据存放的位置就是 他的地址. 5)bit是位 是指为0 或者1。

    byte 是指字节, 一个字节 = 八个位. 6)一定要记住 二进制 如何划成 十进制。

    概念常考到的:

    1、编译预处理不是C 语言的一部分,不占运行时间,不要加分号。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。

    2、每个C语言程序中main函数是有且只有一个。

    3、在函数定义中不可以再定义函数、即不允许函数嵌套定义。

    4、算法可以没有输入,必须要有输出。

    5、break可用于循环结构和switch语句。

    6、逗号运算符的级别最低。

    7、任意合法的表达式一定有一个数值与它对应。

    第一章 1)C程序中对字母的大小写是敏感的,如A与a是不同的标识符。

    注释:是对程序的说明,目的是提高程序的可读性,可出现在程序中任意合适的地方,注释从'/*“开始到最近一个'*/“结束,其间任何内容都不会被计算机执行,不允许嵌套注释。

    3)合法的用户标识符考查:

    合法的要求是由字母,数字,下划线组成。有其它元素就错了。

    并且第一个必须为字母或则是下划线。第一个为数字就错了。

    关键字不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。

    注意:连接(-)符不能出现在标识符中;

    区分字母o与数字0,字母l和数字1;

    熟悉常见的关键字 4)实型数据的合法形式:

    2.333e-1 就是合法的,且数据是2.333×10-1。

    ...

    == 试读已结束,如需继续阅读敬请充值会员 ==

    本站文章均为原创投稿,仅供下载参考,付费用户可查看完整且有格式内容!

    (费用标准:38元/月,98元/年,微信支付秒开通!)

    升级为会员即可查阅全文 。如需要查阅全文,请

    免费注册

    登录会员

    7079f5ff82cfac0c452faa2c1f357d20.png

    773d5907648eeae6d32207c14e470447.png

    展开全文
  • C语言

    2021-04-01 10:42:06
    main表示“主函数”,每个C语言程序必须有一个main函数,函数体{ }括起来; printf是C语言的输出函数; “\n”:换行符,每个语句都有一个分号代表结束。 C语言程序的结构特点 1.头文件(作用:通过头文件来调用库...

    C语言基础总结

    C语言概述

    #include<stdio.h>为头文件,每个C语言程序都有一个头文件;
    main表示“主函数”,每个C语言程序必须有一个main函数,函数体用{ }括起来;
    printf是C语言的输出函数;
    “\n”:换行符,每个语句都有一个分号代表结束。
    C语言程序的结构特点
    1.头文件(作用:通过头文件来调用库功能)
    2.主函数
    一个完整的C程序,必须包含一个且只有一个主函数
    C程序总是从main函数(主函数)开始执行的
    3.函数结构
    任何函数,包括主函数main()都是由函数说明和函数体两部分组成
    函数类型 函数名 (参数表)
    {
    函数体
    }
    函数体,即函数说明下面的花括号内的部分。函数体包含声明部分和执行部分,声明部分包含定义所要用到的变量和所调用的函数声明;
    执行部分由若干个语句构成
    C语言的基本单位是函数,它是由函数说明和函数体两部分组成
    注释
    单行注释://注释部分
    多行注释:/* 注释
    部分*/
    scanf():输入函数
    printf():输出函数
    1.C语言既具有高级语言的特性,又具有低级语言的许多功能。
    2.C语言源程序文件的扩展名为C。
    3.构成C程序的基本单位是函数。
    4.一个完整的C程序必须有且只有一个主函数。
    5.用户定义函数一般分为函数说明和函数体两部分。

    展开全文
  • 比方主函数int main() {}这里就必须有一个return,只有void时可以不用返回值。 功能函数 int fun() { return 1; } 这个时候fun函数作用就是返回一个int 类型值,可以直接拿来比方int a=...
  • 初识C语言

    2021-06-09 21:08:32
    3、一个C语言代码中必须包括一个main函数--主函数 main函数是有固定写发 main函数只能有一个 main函数是程序入口 4、库函数--C语言自身提供函数--引入头文件 stdio.h-标准输入输出 5、C语言常见数据...
  • main函数是必须的

    2017-12-09 22:11:00
    问题引出:C语言编程非得用主函数main吗,不用是否可以? 对此问题进行研究,tc.exe书写代码如下: 图1 没有main函数c程序 对其进行编译,链接发现,编译阶段可以完成,但是链接阶段无法完成。即无法通过...
  • C语言程序组成

    千次阅读 多人点赞 2018-03-21 17:50:18
    函数必须有一个且只能有一个主函数main(),主函数的名为mainmain()是在程序什么位置,C程序总是从main()函数开始执行。可以是系统预定义标准函数,如scanf函数,printf函数等。大多数函数由程序员...
  • 每个 C 程序有且只有一个主函数 main) 且程序必须main) 函数开始执行并在 main) 函数中结束 2. 在 C 语言中用 e 来表示科学计数法时规定在 e 前面必 须有数字后面必须为整数 3. 单引号括起来一个字符常量...
  • C语言总结

    2017-11-17 20:16:06
    一个C程序必须有且仅有一个用main作为名字函数,这个函数称为主函数。C程序总是从主函数开始执行,与它在程序中位置无关。 C语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类...
  • 一个完整的C语言程序,是由一个、且只能有一个main()函数(又称主函数必须有)和若干个其他函数结合而成(可选)。 main函数是C语言程序入口,程序是从main函数开始执行。 其他函数 从函数定义角度看,函数可...
  • 第一章 C语言概述 选择题 C语言规定必须用 作为主函数名A)Function B)include C)main D)stdio一个C程序可以包含任意多个不同名函数但有且仅有一个序总是从 开始执行 选择题 C语言规定必须用 作为主函数名 A)...
  • 2、 C语言的基本结构包括主函数和程序体两部分,主函数是程序的入口函数main()。 3、 对于C语言的头文件如果是系统定义的,一般用尖括号<> 括起来,如果为自己定义的,那必须用双引号《》括起来。 ...
  • C语言第1章概述.doc

    2020-03-01 17:41:30
    第一章 概述 单选题 C语言的前身是(B ) A语言 B语言 C++语言 BASIC语言 C语言规定必须用(C )作为主函数名 Function include main void 一个C程序可以包含任意多个不同名的函数但有且仅有一个(B ) 过程 主函数 函数 ...
  • C语言基础知识

    2018-07-12 11:07:27
    用C语言编写程序被称为C语言源程序,源程序文件后缀名为".c";源程序经编译后生成后缀名为".obj"目标文件;目标文件与各种库函数连接,就生成".exe"可执行文件。C程序有三种基本结构:顺序结构、选择结构、...
  • 知识 C语言基础知识 每个C程序有且只有一个主函数main)且程序必须main)函数开始执行并在main)函数中结束 在C语言中用e来表示科学计数法时规定在e前面必须有数字后面必须为整数 单引号括起来一个字符常量只能...
  • 因此,这两个函数在括号中参数表都由以下两部分组成: “格式控制串”,参数表 格式控制串是一个字符串,必须用双引号括起来,它表示了输入输出量数据类型。各种类型格式表示法可参阅第三章。在printf函数中...
  • 可编辑文档 PAGE 页码页码/NUMPAGES 总页数总页数 C语言基础知识 每个C程序有且只有一个主函数main)且程序必须main)函数开始执行并在main)函数中结束. 在C语言中用e来表示科学计数法时规定在e前面必须有数字后面...
  • ='\0') //直接引用从主函数传递过得来实参 { sum+=a[i]; ++j; } else break; } ave=sum/j; return ave; s=FANG_01(ave,a,j); //在其他函数中调用,则应在外部声明 printf("方差=...
  • C语言复习资料.docx

    2020-03-08 20:39:13
    2. 必须有且只能有一个主函数main() 3. 程序执行从main开始,在main中结束,其它函数通过嵌套调用得以执行。 4. main函数在程序中位置任意,可以在程序开头、中间或者尾部。 o 程序语句 1. C程序由语句组成...
  • 精品文档 收集于网络如有侵权请联系管理员删除 收集于网络如有侵权请联系管理员删除 精品文档 收集于网络如有侵权请联系管理员删除 第一章 C语言基础知识 一选择题 1C语言规定必须用 作为主函数名 AFunction ...
  • C语言易错知识点集合

    2020-08-26 22:25:21
    主函数一定要用main表示 2.数据结构不能用来描述算法,自然语言,流程图,计算机编写程序可以 3.预处理指令不一定非得在开头 “#include”实现文件包含功能,不是每个C程序都必须具备。 4.小写字母ASCII码值比...
  • c语言基础知识入门

    2016-11-06 22:31:34
    1. 每个C程序有且只有一个主函数main(),且程序必须main()函数开始执行,并在main()函数中结束。  2. 在C语言中,e来表示科学计数法时,规定在e前面必须有数字,后面必须为整数。   3. 单引号括起来...
  • C语言综述

    2019-09-29 12:20:38
    1.预处理指令:在变异之前执行指令。 系统自带文件<>,自己写文件""; .h成为头文件,用来声明一些...3.函数:(1)主函数 main()(2)库函数(3)自定义函数 注意: (1)函数位置不能颠倒:一行一行执...
  • 第一章 C语言概述 一选择题 1C语言规定必须用 作为主函数名 A)Function B)include C)main D)stdio 2一个C程序可以包含任意多个不同名函数但有且仅有一个 一个C程 序总是从 开始执行 A)过程 B)主函数 C)函数 D)...

空空如也

空空如也

1 2 3 4 5
收藏数 94
精华内容 37
关键字:

c语言的主函数必须用main

c语言 订阅