关于C语言中的main函数的一点说明

本文探讨了C语言中主函数参数argc、argv和envp的使用方式,并通过实例解释了如何正确处理命令行参数与环境变量。

稍微知道C语言的人就知道,C语言中的主函数通常具有如下的形式:

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

其中argc记录参数的个数,argv则记录具体的参数,是一个参数数组。在默认情况下,argc==1,argv[0] == 程序名称。

假设编写如下的程序:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3
  4 int main(int argc,char *argv[])
  5 {
  6     char p1[100];
  7     char p2[100];
  8     char p3[100];
  9
 10     if(argv[1]){
 11         strcpy(p1,argv[1]);
 12     }else{
 13         strcpy(p1,"hello");
 14     }
 15
 16     if(argv[2]){
 17         strcpy(p2,argv[2]);
 18     }else{
 19         strcpy(p2,"hello");
 20     }
 21
 22     if(argv[3]){
 23         strcpy(p3,argv[3]);
 24     }else{
 25         strcpy(p3,"hello");
 26     }
 27
 28     printf("%s/n",p1);
 29     printf("%s/n",p2);
 30     printf("%s/n",p3);
 31
 32     return 0;
 33 }

我想这个程序原本的目的是想在执行时传入三个参数,分别将它们打印出来。

例如执行 ./main  hello  world  cc

并假定如果传入的参数少于3个,则默认的使用"hello" 代替。

例如执行./main  时期望输出hello  hello hello

但是实际上,大家可以自己运行一下看看,我的输出结果是:

hello
ORBIT_SOCKETDIR=/tmp/orbit-wzy
HOSTNAME=wzy

表示argv[1]此时的确为null,但是argv[2]和argv[3]却不是空的。这是为什么呢?

因为main函数真正完整的形式是

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

参数argc指出了运行该程序时命令行参数的个数,数组argv存放了所有的命令行参数,数组envp存放了所有的环境变量。

环境变量一般以字符串"XXX=xxx"的形式存在,XXX表示变量名,xxx表示变量的值。

值得一提的是,argv数组和envp数组存放的都是指向字符串的指针,这两个数组都以一个NULL元素表示数组的结尾。

我们可以通过以下这个程序来观看传到argc、argv和envp里的都是什么东西:

int main(int argc, char *argv[], char *envp[])
{
    printf("/n### ARGC ###/n%d/n", argc);
    printf("/n### ARGV ###/n");
    while(*argv)
       printf("%s/n", *(argv++));
    printf("/n### ENVP ###/n");
    while(*envp)
       printf("%s/n", *(envp++));
   return 0;
}

这下该明白了吧,至于前面的例子中为什么argv[2]不为空,是因为argv数组和envp数组是连续存储的,

所以argv[2]的指针越界就指向了envp数组中的内容。

### C语言中 `main` 函数的位置规则 在C语言中,`main` 函数的位置并不固定[^1]。程序可以将 `main` 函数定义在源文件的任意位置,只要确保它是程序的入口点即可。尽管 `main` 函数的位置灵活,但程序的执行始终从 `main` 函数开始,无论它在源文件中的具体位置如何。 #### 关于 `main` 函数的基本结构 `main` 函数是C语言程序的入口点,其基本定义形式如下: ```c int main(void) {} ``` 此外,`main` 函数也可以接受参数,常见的形式为: ```c int main(int argc, char *argv[], char *envp[]) {} ``` 这种形式允许程序接收命令行参数和环境变量[^3]。 #### 示例代码 以下是一个简单的C语言程序,展示了 `main` 函数可以在源文件中的不同位置: ```c #include <stdio.h> void helper_function() { printf("This is a helper function.\n"); } int main() { printf("Program starts here.\n"); helper_function(); return 0; } ``` 在这个例子中,`main` 函数位于 `helper_function` 定义之后。然而,程序仍然从 `main` 函数开始执行,证明了 `main` 函数的位置并非固定。 #### 特殊说明 虽然 `main` 函数的位置不固定,但在实际编程实践中,通常将其放置在源文件的顶部或接近顶部的位置,以便于阅读和维护。这是出于代码可读性和逻辑清晰性的考虑[^2]。 ### 注意事项 当使用带参数的 `main` 函数时,必须正确处理传入的参数,例如命令行参数和环境变量。以下代码展示如何访问环境变量: ```c #include <stdio.h> int main(int argc, char *argv[], char *envp[]) { for (int i = 0; envp[i] != NULL; i++) { printf("%s\n", envp[i]); } return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值