string pointer in einer funktion zuweißen



  • Hi
    Ich habe ein Problem mit einem Program das in etwa so aussieht:
    In der Funktion (processArgs) sollen die argumente des Programmes ausgewertet werden,
    und dann zwei davon (strings) den strings aus der Hauptfunktion (main) zugewiesen werden, um diese in main verwenden zu können.
    Mit pointern müsste das über eine normale zuweißung gehen ...

    int main(int *argc, char **argv)
    {
    	char *string1 = NULL;
    	char *string2 = NULL;
    	...
    
    	processArgs(argc, argv, string1, string2);
    	fprintf(stdout, "String1:%s\n", string1);
    	fprintf(stdout, "String2:%s\n", string2);
    	...
    }
    
    processArgs(int argc, char **argv, char *string1, char *string2)
    {
    	...
    	fprintf(stdout, "argvX:%s\n", argv[x]);
    	fprintf(stdout, "argvY:%s\n", argv[y]);
    	inFileA = argv[x];
    	inFileB = argv[y];
    	fprintf(stdout, "String1:%s\n", string1);
    	fprintf(stdout, "String2:%s\n", string2);
    	...
    }
    

    Die ausgabe gibt aber:

    argvX:WertX
    argvY:WertY
    String1:WertX
    String2:WertY
    String1:(null)
    String2:(null)

    es scheint so als ob im hauptptogramm die Strings nicht mehr da sind,
    bzw gar nicht richtig gesetzt werden.

    Dachte dann OK, vl bei der Zuweisung noch ein & dazu (obwohl Arrays doch eh eine Adresse sind?):
    inFileA = &argv[x];
    das liefert aber Warnings von wegen inkompatible Zuweisung beim Kompilieren (funktionieren tuts auch nicht)

    Ich bin grad sehr verwirrt ...
    Könnte mir wer sagen wie es richtig geht und auch erklären WARUM?



  • Die Variablen aus den Parametern einer Funktion sind immer lokal.
    Wenn davon eine ein Zeiger ist, kannst du die Speicherstelle auf die der Zeiger Verweist verändern.
    string1 verweist aber auf NULL, blöde Idee, an der Stelle etwas zu ändern.

    Du willst ja den Wert von string1 selber verändern, darum musst du die Adresse von string1 übergeben.

    char *string2 = NULL;
        ...
    
        processArgs(argc, argv, &string1, &string2);
    
    processArgs(int argc, char **argv, char **string1, char **string2)
    {
        ...
        *string1 = argv[x];
    


  • DirkB schrieb:

    Die Variablen aus den Parametern einer Funktion sind immer lokal.

    Das war die Crux in meinem Kopf. War mir dessen zwar iwie bewusst,
    aber dachte naja bei Pointern, die verweißen ja auf das und irgendwie ...
    Naja aber Pointer müssen ja selber auch gespeichert werden 😉

    DirkB schrieb:

    kannst du die Speicherstelle auf die der Zeiger Verweist verändern.
    string1 verweist aber auf NULL, blöde Idee, an der Stelle etwas zu ändern.

    So hab ich auch schon gedacht, aber das mit dem NULL ist mir glücklicherweise eh auch eingefallen.

    DirkB schrieb:

    Du willst ja den Wert von string1 selber verändern, darum musst du die Adresse von string1 übergeben.

    char *string2 = NULL;
        ...
       
        processArgs(argc, argv, &string1, &string2);
    
    processArgs(int argc, char **argv, char **string1, char **string2)
    {
        ...
        *string1 = argv[x];
    

    So was mich jetzt aber verwirrt, gilt das nicht auch für argv?
    Müsste ich das nicht in einen Pointer auf einen Array von Arrays machen also:
    char ***arg? (bei int argc ists egal, wel ich das nicht wieder zurück gebe)

    Naja werd das morgen dann testen Danke!



  • Du willst ja nicht argv verändern. argv zeigt auf den Anfang eins Arrays mit Zeigern auf char.

    mit den *** könntest du dann argv aus der Funktion heraus ganz woanders hinzeigen lassen.


Anmelden zum Antworten