Chinaunix首页 | 论坛 | 博客
  • 博客访问: 132220
  • 博文数量: 38
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 191
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-16 11:31
个人简介

嵌入式新人

文章分类

全部博文(38)

文章存档

2016年(38)

我的朋友

分类: 嵌入式

2016-08-11 21:21:41

C语言规定main函数是C程序的入口,程序中的其它函数直接或间接被main函数调用后才能被执行,如果没有被main调用,这个函数在程序中就是无用的。那么在linux中,main函数又是被谁调用的呢?

Linux中,父进程fork出子进程,然后程序在子进程中执行,也即程序是被父进程调用的,因此main函数也是被父进程调用的。调用过程中就涉及到父进程传参给main函数和main函数返回值给父进程的问题,这里依次说明。

1 main函数的传参

1.1 通过argcargvmain传参

    当不需要给main函数传参时,main函数可以写作:

int main(void)   //void表示不需要传参给main函数

当需要给main函数传参时,main函数可以写作:

int main(int argc, char *argv[])  //通过C语言预订的参数argcargvmain传参

argcint类型,表示运行程序的时给main函数传递参数的数量;

argv是字符串数组,用来存储多个字符串,一个字符串表示传给main函数的一个参数。argv[0]表示传给main函数的第一个参数,这个参数默认固定为我们执行.out程序,无法更改;argv[1]是传给main的第二个参数,才是我们真正可以传递给main函数的参数,依此类推,argv[2]argv[3]…是第3和第4个参数,可以真正传递参数。

1.2main函数的传参示例

示例实现的功能是:函数执行时,当传递的参数argv[1]=0时,打印出I am a boy!;参数argv[1]=1时,打印出I am a girl!argv[1]为其它值时,打印出Argument argv[1] should be 0 or 1!!!

#include

#include

int main (int argc, char *argv[])

{

    int i = 0;

   

    printf("Passed main func argument num is %d.\n", argc);

    for (i=0; i

    {

       printf("Argument Num %d is %s.\n", i, argv[i]);

    }

   

    if(argc != 2)

    {

       printf("Error!!! \nPls input 2 argument for main func \n");

       return -1 ;

    }

    if(!strcmp(argv[1],"0"))

    {

       printf("I am a boy !\n");

    }

    else if(!strcmp(argv[1],"1"))

    {

       printf("I am a girl !\n");

    }

    else

    {

       printf("Argument argv[1] should be 0 or 1 !!!\n");

    }

          

    return 0;

}

各种情况的执行结果见图

1.3注意事项

(1) main函数的参数是在程序执行时传递的,各参数间是通过空格来间隔。

(2) main函数的参数是字符串类型的,不能是其它类型。

(3) 程序内部一定要先检验传递参数数目是否等于argc

2 main函数的返回值

Linux中, main函数被父进程调用后,可以返回值给父进程, 例如,返回 0表示执行成功,-1表示失败。

2.1 main函数的返回值示例

    main函数执行完成后,返回255(返回值需要在0-255之间,如果为负数,就自动转换为0~255间的数,数值等于256-负数的绝对值)。

#include

int sum(int a, int b)

{

    return a+b;

}

int main(void)

{

    int a = 0, b = 3, c = 0;

    a = sum(b, c);

    printf("a = %d.\n", a);

    return 255;

}

linux中使用vi return.sh编写脚本文件,内容是

#!/bin/sh

./a.out

echo $?

编译C程序后执行程序可见

(1)     执行./a.out后, 仅输出a = 3

(2)     执行 source return.sh后,不但输出了a = 3,还输出了返回值255

(3)     window中使用记事本编写脚本文件rtt.sh,内容与return.sh相同,使用ANSI编码格式,然后执行source rtt.sh,会出现错误。说明在windows下编写的脚本文件,在linux下无法执行,原因是文件格式不同,使用BeyondCompare对比两个文件的16禁止编码,可见rtt中多了0D(回车符号)和0A(换行符号)。

3 使用main函数传参实现10以内的加法计算器

#include

#include

int main (int argc, char *argv[])

{

    int i = 0;

   

    printf("Passed main func argument num is %d.\n", argc);

    for (i=0; i

    {

       printf("Argument Num %d is %s.\n", i, argv[i]);

    }

   

    if(argc != 3)

    {

       printf("Error!!! \nPls input 3 argument for main func \n");

       return -1 ;

    }

       printf("result= %d .\n",(*argv[1]-48)+(*argv[2]-48));

             

    return 0;

}

运行结果

阅读(3519) | 评论(0) | 转发(0) |
0

上一篇:C语言中的字符串

下一篇:void和void*详解

给主人留下些什么吧!~~