2010-10-30 14 views
9

Ich habe zufällig mehrere Funktionen, die auf verschiedene Argumente des Programms über das Array argv[] zugreifen. Im Moment sind diese Funktionen in der main()-Funktion verschachtelt, da der Compiler eine Spracherweiterung bietet, um solche Strukturen zu ermöglichen.Zugriff auf argv [] von außerhalb der Funktion main()?

Ich möchte die verschachtelten Funktionen loswerden, damit Interoperabilität möglich ist, ohne von einer Spracherweiterung abhängig zu sein.

Zuerst dachte ich an einen Array-Zeiger, den ich auf argv[] zeigen würde, sobald das Programm startet, würde diese Variable außerhalb der main()-Funktion sein und vor den Funktionen deklariert, so dass sie von ihnen verwendet werden könnten. So

erklärte ich solch einen Zeiger wie folgt:

char *(*name)[]; 

, die einen Zeiger auf ein Array von Zeigern auf Zeichen sein sollte. Allerdings, wenn ich versuche, es zu argv[] hinweisen, erhalte ich eine Warnung bei einer Zuordnung von einem inkompatiblen Zeigertyp:

name = &argv; 

Was könnte das Problem sein? Denken Sie über einen anderen Weg nach, um auf das argv[] Array von außerhalb der main() Funktion zuzugreifen?

Antwort

6
char ** name; 
... 
name = argv; 

wird der Trick :)

Sie sehen char *(*name) [] ist ein Zeiger auf Array von Zeigern auf char. Dagegen hat Ihr Funktionsargument argv einen Zeiger auf den Zeiger auf char, und daher hat & argv einen Zeiger auf Zeiger auf Zeiger. Warum? Wenn Sie eine Funktion deklarieren, um ein Array zu übernehmen, ist das für den Compiler dasselbe wie eine Funktion, die einen Zeiger verwendet. Das heißt,

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

sind absolut identische äquivalente Deklarationen. Nicht, dass ein Array ist ein Zeiger, sondern als Funktionsargument ist es

HTH

+0

+1 für die erste Antwort * und mehr * die einzige Antwort soweit den Fehler zu erklären. –

+0

Danke für die Erklärung! Ich benutzte 'argv' als' char * argv [] ', also dachte ich an einen Array-Zeiger am Anfang. – Sergi

+0

@Johannes, @Sergi: Danke, ich möchte, dass C/C++ - Bücher einen größeren Akzent auf Unterschiede zwischen Arrays und Zeigern setzen. Diese werden viel zu oft vermischt ... –

3

Diese Arbeit sollte,

char **global_argv; 


int f(){ 
printf("%s\n", global_argv[0]); 
} 

int main(int argc, char *argv[]){ 
    global_argv = argv; 
f(); 
} 
0
#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); 
}