zoukankan      html  css  js  c++  java
  • 关于main函数的参数,argc,argv的内部机制

    偶尔对main函数的参数感兴趣,写了个程序验证。

    int main(int argc,char **argv)

    首先,解释两点:

    第一 、系统将参数列表,即我们在shell下输入的命令,存储到一个一维字符数组中,而且用户是可修改的,肯定没存在常量区。

    第二 、argv实际上是一个char*argv[],字符指针数组,元素个数现在不清楚,至少有argc个,还有一些其他的,例如HOSTNAME,SELINUX_ROLE_REQUESTED,TERM,SHELL,HISTSIZE,SSH_CLIENT,SELINUX_USE_CURRENT_RANGE,QTDIR,QTINC,SSH_TTY,SVN_EDITOR等,

    然后根据参数列表中的空格,划分各个参数,各个参数的首地址存储到argv[i]中,然后让*(argv[i]-1)=0,即用代替原来的空格,这样可以打印出各个参数。

    下面贴出我的程序,大家可以自己试验一下。

    /*argcargv.c*/

    #include <stdio.h>

    #include <string.h>

    int main(int argc,char ** argv)

    {

      int i;

      for(i=0;i<argc/*20,可以自己设定一个大于argc的值,看看argv到底有多少个元素*/;i++)

      {

        printf("%p,%s",argv[i],argv[i]);

        printf("$ ");

      }

      printf(" ");

      strcpy(argv[0],"meilidezhongguo,nihao!");

      for(i=0;i<argc,i++)

      {

        printf("%p,%s",argv[i],argv[i]);

        printf("$ ");

      }

      printf(" ");

    }

    程序运行: ./a.out abc 123 def 456 hello 789 world

    我的电脑运行结果如下:

    0xbff64758,./a.out$

    0xbff64760,abc$

    0xbff64764,123$

    0xbff64768,def$

    0xbff6476c,456$

    0xbff64770,hello$

    0xbff64776,789$

    0xbff6477a,world$

    (nil),(null)$

    .......

    .......

    .......

    .......

    0xbff64758,meilidezhongguo,nihao!$

    0xbff64760,hongguo,nihao!$

    0xbff64764,guo,nihao!$

    0xbff64768,nihao!$

    0xbff6476c,o!$

    0xbff64770,hello$

    0xbff64776,789$

    0xbff6477a,world$

    也可以用

    strncpy(argv[0],"meilidezhongguo,nihao!",28);

    代替strcpy(argv[0],"meilidezhongguo,nihao!");

    试试,

    还可以看出strncpy,拷贝了22个字符,strlen("meilidezhongguo,nihao!");剩下额6个字符补上.

    理解限制,只能补充这些,下次有了新理解,再完善!

  • 相关阅读:
    各种数据库默认端口总结
    Entity Framework学习
    Entity Framework学习
    .Net MVC API初试
    MongoDB Shell
    MongoDB安装及简单实验
    Android Studio记录
    Android使用Fragment程序崩溃
    git操作笔记
    centos防火墙设置
  • 原文地址:https://www.cnblogs.com/blueyunchao0618/p/3283318.html
Copyright © 2011-2022 走看看