分类: 嵌入式
2016-08-11 21:21:41
C语言规定main函数是C程序的入口,程序中的其它函数直接或间接被main函数调用后才能被执行,如果没有被main调用,这个函数在程序中就是无用的。那么在linux中,main函数又是被谁调用的呢?
Linux中,父进程fork出子进程,然后程序在子进程中执行,也即程序是被父进程调用的,因此main函数也是被父进程调用的。调用过程中就涉及到父进程传参给main函数和main函数返回值给父进程的问题,这里依次说明。
1 给main函数的传参
1.1 通过argc和argv给main传参
当不需要给main函数传参时,main函数可以写作:
int main(void) //void表示不需要传参给main函数
当需要给main函数传参时,main函数可以写作:
int main(int argc, char *argv[]) //通过C语言预订的参数argc和argv给main传参
argc是int类型,表示运行程序的时给main函数传递参数的数量;
argv是字符串数组,用来存储多个字符串,一个字符串表示传给main函数的一个参数。argv[0]表示传给main函数的第一个参数,这个参数默认固定为我们执行.out程序,无法更改;argv[1]是传给main的第二个参数,才是我们真正可以传递给main函数的参数,依此类推,argv[2]、argv[3]…是第3和第4个参数,可以真正传递参数。
1.2给main函数的传参示例
示例实现的功能是:函数执行时,当传递的参数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;
}
运行结果