Übergabe von char * vs char ** als Parameter an eine Funktion in C

9

Ich habe mehrere Diskussionen über das Bestehen von char * in C gelesen.

stackoverflow: passing -an-array-of-strings-als-Parameter-zu-Funktion-in-c
stackoverflow: wie funktioniert eine Zeiger-Zeiger-zu-Zeiger-Arbeit
Stackoverflow: Was ist Ihre Lieblings-Programmierer-Ignoranz-Pet-peeve
drexel.edu: Zeichensätze

Viele von ihnen enthalten Diskussionen über Arrays, aber ich möchte mich davon fernhalten.

Ich schreibe ein Beispielprogramm, um mich selbst über die Weitergabe von char * und char ** in C zu unterrichten. Dies ist eine Übung zum Übergeben von char *, ohne (Zeiger auf) Arrays zu verwenden. Auch keine Bedenken hinsichtlich der Ausführungseffizienz. : -)

%Vor%

Sie können auch den gleichen Code auf github

anzeigen

Der obige Code ist etwas selbstdokumentierend. main() deklariert zwei char * Variablen und übergibt sie als Parameter an ihre jeweiligen get_args() Funktionen.

Jede Funktion get_args() ruft char * get_string(int, char **) auf, wobei derselbe Aufruf verwendet wird (aber der Rückgabewert anders erfasst wird).

get_string() funktioniert gut; Es macht malloc() und gibt den Zeiger zurück an die aufrufende Funktion. Dieser Code funktioniert, und jede get_args() -Funktion erhält den Rückgabewert, wie ich es erwarte.

Aber wenn die get_args () - Funktionen zu main() zurückkehren, warum kommt der dereferenzierte Zeigerwert zurück zu main (aus get_args_works() , aber nicht aus dem Zeigerwert (aus get_args_broken() )?

)

(dh ich kann sehen, wenn ich den Zeiger ( &string_works ) beim Senden als Parameter dereferenziere, funktioniert das. Aber warum? Ist char * string_broken nicht schon ein Zeiger? Warum braucht er die "extra" -Deferenz beim Senden als Parameter?)

Ich hoffe auf eine gewinnbringende Antwort, die erklärt, wie Sie (ja, Sie) das Senden von char * als Parameter gegenüber dem Empfangen als Rückgabewert der Funktion konzeptualisieren.

    
Thunder Rabbit 22.11.2010, 06:36
quelle

2 Antworten

4
%Vor%

Sie ändern nur die lokale Variable string (automatisch). Das ist für den Aufrufer in keiner Weise sichtbar. Beachten Sie, dass dies bedeutet, dass Sie einen wilden Zeiger in main freigeben.

Es ist falsch aus dem gleichen Grund:

%Vor%

ist; Der Parameter wird nach Wert kopiert . Außerdem geben Sie kein int zurück (wie Sie es erklärten).

%Vor%

ist korrekt (außer der fehlenden Rückgabe). Sie ändern string nicht, was sinnlos wäre. Sie ändern das Objekt an die Position in string , was in diesem Fall ein char * ist.

EDIT: Sie müssten * argv verdreifachen, wenn es eine Funktion gab, die main aufruft, und Sie wollten die Variable dieser Funktion auf ein anderes Zeichen setzen **. E.G.

%Vor%     
Matthew Flaschen 22.11.2010, 06:41
quelle
1

Einer der Bedürfnisse, Zeiger auf einen Zeiger (hier get_args_works() ) zu verwenden, ist, mehr als auf Variable von einer Funktion zu ändern (oder zurückzubringen), wie in C ist es nicht möglich, mehr als eine Variable zurückzugeben.

get_args_works() funktioniert 'coz, Sie übergeben Zeiger auf einen Zeiger & amp; Eine Referenz darauf gibt es in deinem main() .

Aber in get_args_broken() übergeben Sie nur einen Zeiger. Nichts falsch hier, jetzt machen Sie malloc() & amp; Rückgabe der Speicher zugewiesene Zeichenfolge an get_args_broken() , immer noch nichts falsch hier. Aber jetzt ist dieser mem zugewiesene String lokal & amp; main() hat keinen Verweis auf diese Variable. Wenn Sie char *string_broken; in main () dereferenzieren, kann dies zu undefiniertem Verhalten führen.

Hoffe, das ist klar.

    
Srikar Appalaraju 22.11.2010 06:52
quelle

Tags und Links