【问题标题】:How to access argv[] from outside the main() function?如何从 main() 函数外部访问 argv[]?
【发布时间】:2011-05-02 18:13:29
【问题描述】:

我碰巧有几个函数通过argv[] 数组访问程序的不同参数。现在,这些函数嵌套在 main() 函数中,因为编译器提供了语言扩展来允许这样的结构。

我想摆脱嵌套函数,以便在不依赖语言扩展的情况下实现互操作。

首先我想到了一个数组指针,一旦程序启动,我将指向argv[],这个变量将在main() 函数之外并在函数之前声明,以便它们可以使用。

所以我声明了这样一个指针如下:

char *(*name)[];

它应该是一个指向字符指针数组的指针。但是,当我尝试将其指向 argv[] 时,我会收到来自不兼容指针类型的赋值警告:

name = &argv;

可能是什么问题?您是否想到了从main() 函数外部访问argv[] 数组的另一种方法?

【问题讨论】:

    标签: c command-line-arguments argv


    【解决方案1】:
    char ** name;
    ...
    name = argv;
    

    会成功的:)

    你看char *(*name) [] 是一个指向char 指针数组的指针。而您的函数参数 argv 具有指向 char 的指针的类型指针,因此 &argv 具有指向指向 char 的指针的类型指针。为什么?因为当您声明一个函数以获取数组时,编译器与获取指针的函数相同。也就是说,

    void f(char* a[]);
    void f(char** a);
    void f(char* a[4]);
    

    是完全相同的等价声明。不是说数组是指针,而是作为函数参数它是

    HTH

    【讨论】:

    • +1 是第一个答案迄今为止解释错误的唯一答案。
    • 感谢您的解释!我使用argv 作为char *argv[],所以我一开始就想到了一个数组指针。
    • @Johannes, @Sergi:谢谢,我希望 C/C++ 书籍能够更加强调数组和指针的差异。这些经常混淆......
    【解决方案2】:

    这应该可行,

    char **global_argv;
    
    
    int f(){
     printf("%s\n", global_argv[0]); 
    }
    
    int main(int argc, char *argv[]){
      global_argv = argv;
     f(); 
    }
    

    【讨论】:

      【解决方案3】:
      #include <stdio.h>
      
      int foo(int pArgc, char **pArgv);
      
      int foo(int pArgc, char **pArgv) {
          int argIdx;
      
          /* do stuff with pArgv[] elements, e.g. */      
          for (argIdx = 0; argIdx < pArgc; argIdx++)
              fprintf(stderr, "%s\n", pArgv[argIdx]);
      
          return 0;
      }
      
      int main(int argc, char **argv) {
          foo(argc, argv);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-11
        • 2017-03-13
        • 2022-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-29
        • 2011-12-14
        相关资源
        最近更新 更多