2009-12-01 19 views
8

gcc würde diese Datei nicht kompilieren, aber nach dem Hinzufügen #include <cstring> konnte ich g ++ verwenden, um diese Quelldatei zu kompilieren.Zeiger Argument durch Verweis unter C übergeben?

Das Problem ist: Unterstützt die C-Programmiersprache Zeiger Argument durch Referenz übergeben? Wenn nicht, warum?

Danke.

+0

Nicht verwandt mit Ihrer Frage, aber aus Neugier, was ist der Anwendungsfall für die Übergabe eines Zeigers als Referenz? –

+1

@Tistram: Wenn Sie möchten, dass die Funktion in der Lage ist, den Zeiger zu ändern, und die Änderung über den Rahmen der Funktion hinaus weitergegeben wird. –

+0

Wenn Sie malloc von Zeichenfolgen in einer Funktion ausführen möchten, die diesen Speicher nicht freigibt, können Sie valgrind oder ein gleichwertiges Tool zum Testen auf Speicherlecks verwenden. –

Antwort

29

Nein, C unterstützt keine Referenzen. Es ist von Entwurf. Anstelle von Verweisen können Sie Zeiger auf Zeiger in C verwenden. Verweise sind nur in C++ - Sprache verfügbar.

5

Try this:


void 
getstr(char **retstr) 
{ 
char *tmp = (char *)malloc(25); 
strcpy(tmp, "hello,world"); 
*retstr = tmp; 
} 

int 
main(void) 
{ 
char *retstr; 

getstr(&retstr); 
printf("%s\n", retstr); 

return 0; 
} 
+1

Wirf den Rückgabewert von "malloc" nicht. Es kann einen Fehler bei "#include " verbergen (was Sie im obigen Code vergessen haben). Siehe http://c-faq.com/malloc/mallocnocast.html Vergessen Sie auch nicht, den Rückgabewert von 'malloc' zu überprüfen. –

+3

Wow, einige Leute haben Schwierigkeiten, den Unterschied zwischen Proof-of-Concept-Testroutine und Produktionscode zu erkennen! Es war offensichtlich, dass dies eine rohe Test-Routine war, weil es kein entsprechendes "frei" gab, aber ich denke, einige Leute vermissen das Offensichtliche! –

20

Referenzen sind eine Funktion von C++, während C nur Zeiger unterstützt. Damit Ihre Funktion den Wert des gegebenen Zeiger ändern, übergeben Zeiger auf den Zeiger:

void getstr(char ** retstr) 
{ 
    char *tmp = (char *)malloc(25); 
    strcpy(tmp, "hello,world"); 
    *retstr = tmp; 
} 

int main(void) 
{ 
    char *retstr; 

    getstr(&retstr); 
    printf("%s\n", retstr); 

    // Don't forget to free the malloc'd memory 
    free(retstr); 

    return 0; 
} 
+2

Wirf nicht was malloc() 'zurückgibt. Wenn Sie 'stdlib.h' eingeschlossen haben, tut es absolut nichts. Wenn Sie nicht haben, versteckt es diese Tatsache. –

+3

Da 'malloc'' void * 'zurückgibt, finde ich es gut, es explizit auf den benötigten Typ zu setzen, anstatt sich auf implizite Konvertierungen zu verlassen. Wenn 'stdlib.h' nicht enthalten ist, wird diese Tatsache durch das Casting nicht verborgen - der Compiler wird Sie warnen, dass' malloc' nicht deklariert wurde. –

0

C lang nicht über Referenzgrößen aber seinen Teil von C++ lang.

Der Grund für die Einführung der Referenz ist zu vermeiden, Zeiger dangling und Pre-Checking für Zeiger Nichtigkeit.

Sie können Bezug nehmen als Konstantenzeiger, d. H. Const Zeiger kann nur auf Daten zeigen, die initialisiert wurden, um zu zeigen.

+0

Der andere Unterschied (neben den syntaktischen) ist, dass Referenzen nicht null sein können. –

2

Dies sollte ein Kommentar sein, aber es ist zu lang für ein Kommentarfeld, also mache ich es CW.

kann der Code, den Sie zur Verfügung gestellt besser geschrieben werden als:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void 
getstr(char **retstr) 
{ 
    *retstr = malloc(25); 
    if (*retstr) { 
     strcpy(*retstr, "hello,world"); 
    } 
    return; 
} 

int 
main(void) 
{ 
    char *retstr; 

    getstr(&retstr); 
    if (retstr) { 
     printf("%s\n", retstr); 
    } 
    return 0; 
} 
1

Es gibt einen interessanten Trick in libgmp die Referenzen emuliert: typedef mpz_t __mpz_struct[1];

und dann können Sie so schreiben:

mpz_t n; 
mpz_init(n); 
... 
mpz_clear(n); 

Ich würde nicht empfehlen, diese Methode zu verwenden, weil es für andere unverständlich sein kann, schützt es noch nicht davor, zu sein a NULL: mpz_init((void *)NULL), und es ist so ausführlich wie sein Zeiger-zu-Zeiger-Gegenstück.

Verwandte Themen