In meinen C-Programmen benötige ich häufig eine Möglichkeit, eine Zeichenfolgendarstellung meiner ADTs zu erstellen. Auch wenn ich die Zeichenfolge nicht drucken muss, um sie in irgendeiner Weise auf dem Bildschirm anzuzeigen, ist es ordentlich, eine solche Methode zum Debuggen zu haben. Diese Art von Funktion kommt also oft vor.
char * mytype_to_string( const mytype_t *t );
Mir ist tatsächlich klar, dass ich hier (mindestens) drei Optionen habe, um den Speicher für die Rückgabe der Zeichenfolge zu verwalten.
Alternative 1: Speichern der Rückgabezeichenfolge in einem statischen Zeichenarray in der Funktion. Ich brauche nicht viel nachzudenken, außer dass die Zeichenfolge bei jedem Aufruf überschrieben wird. Was in manchen Fällen ein Problem sein kann.
Alternative 2: Ordnen Sie die Zeichenfolge auf dem Heap mit malloc innerhalb der Funktion zu. Wirklich ordentlich, da ich dann nicht an die Größe eines Puffers oder das Überschreiben denken muss. Ich muss jedoch daran denken, die Zeichenfolge freizugeben (), wenn ich fertig bin, und dann muss ich auch einer temporären Variablen zuweisen, damit ich sie freigeben kann. und dann ist die Heap-Zuweisung wirklich viel langsamer als die Stapelzuweisung. Seien Sie daher ein Engpass, wenn dies in einer Schleife wiederholt wird.
Alternative 3: Übergeben Sie den Zeiger auf einen Puffer und lassen Sie den Aufrufer diesen Puffer zuweisen. Mögen:
char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen );
Dies bringt dem Anrufer mehr Aufwand. Ich stelle auch fest, dass diese Alternative mir eine andere Option in der Reihenfolge der Argumente gibt. Welches Argument sollte ich zuerst und zuletzt haben? (eigentlich sechs Möglichkeiten)
Also, was soll ich bevorzugen? Warum? Gibt es einen ungeschriebenen Standard unter C-Entwicklern?
sysctlbyname
unter OS X und iOS