2017-11-09 6 views
0

Ich beginne gerade mit C, lese viel über Zeiger und Arrays, aber ich kann nicht verstehen, warum mein Code nicht richtig funktioniert.Initialisierungszeiger von argv zum Vergleichen von Adressen

Ich versuche, eine while-Schleife mit der Adresse von argv ersten Element ohne Erfolg zu konditionieren. Ich bin davon überzeugt, dass ich argv den falschen Weg benutze. Hier

ist der Code:

int main(int k, const char* argv[]) 
{ const char** first = NULL ; 
    first = &argv[0] ; 
    argv += k ; 
    while (argv > first) puts(*argv), argv-- ; 
    return 0 ; } 

Gibt einen Segmentation Fault.

Dies ist, was ich in meinem Kopf tue:

einen Zeiger zuerst erstellen, es auf NULL zuweisen (zwei mit * wegen argv Typ)

diese Zeiger auf die Adresse des argv ersten Elements zuweisen , argv [0], um es offensichtlich zu machen.

Verschieben von argc (k) argv

Die while-Schleife argv Adresse zu erster Adresse wird verglichen und Drucke * argv solange argv nicht diese erste Adresse erreicht, dann argv dekrementieren.

Der obige Code sollte in der Tat alle Elemente in einer Befehlszeile zurückgeben, beginnend mit dem letzten und ignorieren den ersten (Programmname).

Vielen Dank für Ihre Hilfe!

Antwort

3

Das Problem ist, dass argv[k] (vor den Änderungen an argv in Ihrem Code) als Nullzeiger definiert ist. Indem Sie argv += k tun, machen Sie argv Punkt auf diesen Nullzeiger, den Sie dann an puts übergeben, was zu undefined Verhalten führt, wenn puts versucht, diesen Nullzeiger zu verwenden.

Ein möglicher Weg, es zu lösen, besteht darin, z.B. argv += (k - 1) stattdessen.

+0

Haben Sie die Antwort von Ihrem bearbeiten! Vielen Dank. – InTheMoodForNow

+0

Ich habe 'printf' anstelle von' puts' verwendet und habe die erste zu druckende Zeichenfolge '(null)' bekommen. – Gaurav

0

Größe von argv in Ihrem Fall ist 1, was bedeutet, nur argv [0] gültig ist während der Herstellung argv + = k Sie Array-Grenzen

1

Anstatt Änderung des Wertes von argv selbst, warum nicht einfach manipulieren, um den Zeiger überschreiten Sie zeigen auf argv (oder auf das Element darin). Wenn Sie argv selbst inkrementieren oder dekrementieren, verlieren Sie den Verweis auf den ursprünglichen Zeiger. Ja, Sie können eine Kopie speichern ..., aber Sie haben sich die Mühe gemacht, einen Zeiger auf argv zu deklarieren, wenden Sie einfach Ihren k (oder argc) Offset auf den Zeiger an, z.

#include <stdio.h> 

int main (int argc, char **argv) { 

    char **p = argv;     /* pointer to argv */ 
    p += argc - 1;     /* advance to last */ 

    printf ("\nin order:");   /* output original order */ 
    for (int i = 1; i < argc; i++) 
     printf (" %s", argv[i]); 

    printf ("\nreverse :");   /* decrement p outputting in reverse */ 
    while (p > argv) 
     printf (" %s", *p--); 

    putchar ('\n'); 

    return 0; 
} 

Beispiel Verwendung/Output

$ ./bin/argvptr my dog has fleas 

in order: my dog has fleas 
reverse : fleas has dog my 
+0

Hinweis HS: Ich verstehe immer noch nicht, warum Menschen Variable am Anfang ihrer Funktion deklarieren und nicht wo sie sie brauchen. – Stargateur

+0

Allgemein, weil sie 'cl.exe' auf Win7 haben und eine C89-kompatible Deklaration benötigen, damit sie zwischen Compilern portierbar ist? ':)' –

+0

Ihr Leben muss schrecklich sein! Aber ich denke, wenn OP nicht einen bestimmten Compiler oder eine C-Version markiert, sollten die Antworten die beste verfügbare Funktion widerspiegeln. OP lernt Programmierung. (MSVC unterstützt diese grundlegende Funktion immer noch nicht?!) – Stargateur

0

Ich weiß nicht, ob ich hier etwas fehlt bin. Wenn Sie nur die Argumente in umgekehrter Reihenfolge drucken möchten, verwenden Sie einfach so etwas:

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int i; 

    for (i = argc - 1; i > 0; i--) { 
     puts(argv[i]); 
    } 
    return 0; 
} 
+1

Ich vermute, dass die OP Pointer Skill trainieren will. Beachten Sie, dass Ihre Antwort die Frage nicht wirklich beantwortet. – Stargateur

+0

Danke August, aber der Grund, warum ich diese spezifische Lösung verwende, ist, weil die Übung so formuliert ist, dass sie versucht, Zeigerfähigkeiten zu trainieren, wie Stargateur bemerkt. Danke für die alternative Lösung. – InTheMoodForNow

Verwandte Themen