main函数参数 argc, argv分析应用


在 C 语言中,定义函数的入口有:

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

其中:

argc --- 定义了执行程序时,携带的参数,其中,也把程序本身的程序名也算在一起;

argv[] --- 存放了程序名 和 携带的参数;

假设程序编译为 out,那么,执行程序

./out www 123

此时:

argc == 3;

argv[0] == ./out
argv[1] == www
argv[2] == 123

//========================================================================

那么,我们知道 char* argv[] 是一个“数组指针”,每一个元素,存放一个指针,指向存放参数的地址;

但是,我们有一个疑问,对应 ./out www 123 这样的数据,是否存在一个“连续的内存块”中呢?

//========================================================================

下面编写程序测试,发现 ./out www 123 这样的字符串参数,存放在一个连续的内存块中;

而且,每一个参数之间,有“字符串”结束符;

我们在测试的时候,为了测试的方便,直接输出 argv[] 地址后的 20 个字符,不考虑内存越界;

输出结果如下:

[0]. 
[1]/ 
[2]o 
[3]u 
[4]t 
[5] 
[6]w 
[7]w 
[8]w 
[9] 
[10]1 
[11]2 
[12]3 
[13] 
[14]O 
[15]R 
[16]B 
[17]I 
[18]T 
[19]_ 

可以看到,第 5,9,13 这样的元素,存放了“字符串”结束符 0 值;

//=================================================================

#include <unistd.h>
#include <stdio.h>


int main(int argc, char* argv[])
{
    int i, len;
    char* p;
    
    printf("argc = %d\n", argc);
    printf("optind = %d\n", optind);

    p = *argv;
    printf("p = %s\n", p);
    len = strlen(p);
    printf("len = %d\n", len);    

    printf("====================\n");
    for(i = 0; i < 20; i++)
    {
        printf("[%d]%c \n", i, p[i]);
    }
    printf("\n");
    return 0;
}

运行结果如下:

[openwrt@localhost64 test]$ ./out www 123
argc = 3
optind = 1
p = ./out
len = 5
====================
[0]. 
[1]/ 
[2]o 
[3]u 
[4]t 
[5] 
[6]w 
[7]w 
[8]w 
[9] 
[10]1 
[11]2 
[12]3 
[13] 
[14]O 
[15]R 
[16]B 
[17]I 
[18]T 
[19]_ 

[openwrt@localhost64 test]$ 

只需要99元就可以投资自己,掌握Linux系统编程!主要传授《Linux C/C++程序设计》《Linux 系统编程》,主页有学习视频!
只需要99元就拥有全部课程和资料,让我们用技术改变自己,改变生活,改变世界!
视频可以百度搜索:韦凯峰Linux编程学堂
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值