2016-03-19 15 views
0

Ich spiele etwa mit C. Nur ein paar Fragen, was ist Best Practice und wenn ich etwas falsch mache.Der beste Weg, um Zeiger zwischen den Funktionen zu übergeben

Ich habe ein Programm gemacht, das scheint zu funktionieren:

void main() 
{ 
    char *text; 
    text = malloc(10 * sizeof(char)); 
    dosomethingwithtext(text); 
    printf("%s\n", text); 
} 

Jedoch habe ich auch Versionen wie diese gesehen habe: (Ich weiß, es wird nichts gedruckt sinnvoll, weil ich keine Zeichen hinzugefügt haben , aber stell dir vor, ich hätte!)

void main() 
{ 
    char *text; 
    text = dosomething(); 
    printf("%s\n", text); 
} 
char * dosomething() 
{ 
    char *text; 
    text = malloc(10 * sizeof(char)); 
    return text; 
} 

Oder wenn einer von diesen nicht optimal ist, was ist der beste Weg. Im Grunde frage ich den häufigsten/besten Weg, dies zu tun.

+0

Art der Meinung basiert, aber ich bin sicher, dass Sie Antworten erhalten werden, die für beide Möglichkeiten einen Fall machen. IMO, beide Wege haben ihre Vorteile je nachdem, wo genannt. In beiden Fällen müssen Sie sich jedoch an die 'free() - Anweisung erinnern. – ryyker

+1

'void main()' ist eine ungültige Signatur für 'main' und veraltete Syntax für jeden Funktionsdeklarator. – Olaf

+0

@Olaf 'veraltete Syntax für jeden Funktionsdeklarator', könnten Sie erweitern? – xvan

Antwort

1

a) In beiden Fällen konnte die Speicherfreigabe nicht aufgehoben werden. Aufrufe zu malloc müssen durch einen Aufruf zur Freigabe ausgeglichen werden.

b) sizeof (char) als 1 in C definiert ist, so gibt es keinen Punkt Berufung sizeof (char)

c) Es ist nicht void main(), es ist int main(void) oder int main(int argc, char** args) - Sie einen Rückgabewert zur Verfügung stellen müssen .

Um die eigentliche Frage zu beantworten, ist beides in Ordnung. Im zweiten Fall erschweren Sie die Verwaltung des Speichers, da Sie das free() nicht in die gleiche Funktion wie malloc() setzen können - Ihr dosomething() gibt einen zugewiesenen Block zurück. Es ist jedoch sehr häufig, dass Programme enden, die an einem Ort vergeben und in einem anderen frei sind.

+0

Ich glaube, die Besetzung von 'void *' ist jetzt veraltet. – chrylis

+2

für C ist das Gießen nicht notwendig. Für C++ ist es erforderlich. – ryyker

+0

Auf C kann es immer noch Warnungen werfen, also ist es besser, das Rauschen zu vermeiden. – xvan

-1

Option 1 hat den Vorteil, dass Zuweisung und Freigabe auf demselben Bereich vorgenommen werden, der (in einer vollständig meinungsbasierten) einfacher zu verfolgen und zu debuggen ist. Sie können den Rückgabewert verwenden, um einen Status zu melden.

Option 2 folgt einem Creational pattern, der auf nicht verwaltetem Speicher undicht ist. Der einzige mögliche Statusbericht ist ein Nullzeiger. (das kann oder kann nicht genug sein).

+0

Der meiste nicht-triviale Code enthält keinen "freien" Code im selben Umfang wie er zugewiesen wurde. Es kann genauso fehleranfällig sein, den zugewiesenen Speicher zu übergeben. – Olaf

+0

Aber zu vergessen, Speicher zu reservieren ist einfacher auf jedem modernen Betriebssystem zu debuggen. Um ein Leck zu finden, müssen Sie sich zunächst bewusst sein, dass Sie eines haben. – xvan

+0

1) Bitte adressieren Sie die Kommentare richtig, sonst werden sie möglicherweise nicht angezeigt. Gesagt: Es gibt mehr zu programmieren in C als auf PC-Ebene. Und deine Aussage ist nicht so allgemein wie sie ist. Es gibt keine einfache Antwort darauf, und es hängt stark von der Anwendung ab. Versuchen Sie einfach, ein nicht-triviales Programm mit dynamisch zugewiesenem Speicher zu schreiben, und Sie werden es verstehen. – Olaf

Verwandte Themen