Hallo Thomas,
Was steckt hier dahinter - warum macht man sowas?
um den String zu kürzen - wozu sonst?
Achso ok. Mir erschien es nur irgendwie komisch, die restlichen Zeichen einfach stehen zu lassen - immerhin belegen die ja unnötig Speicher im Prinzip.
ja schon, aber wie gesagt: Der Speicherbereich ist dem Programm bzw. diesem Zweig des Programms ja sowieso für diesen Zweck zugeteilt. Wenn du Besuch hast und nicht möchtest, dass die Leute in dein Schlafzimmer stolpern, machst du ja auch einfach nur die Tür zu (Nullbyte, hier Ende), anstatt das Schlafzimmer abzureißen oder auszuräumen. ;-)
Jetzt hätte ich noch eine Frage: Ich habe eine Funktion deren Signatur folgendermaßen aussieht
Den Begriff "Signatur" habe ich in dem Zusammenhang noch nicht gehört. Deklaration oder Prototyp ist mir geläufig, auch Funktionskopf habe ich schon oft gehört. Signatur finde ich nicht ganz so intuitiv. Naja, egal.
Wie initialisiere ich nun char** output vor der Übergabe an die Funktion richtig, damit ich keinen Speicherzugriffsfehler erhalte?
void func(int arg1, char **output)
output[0] = sprintf("Ergebnis: %d", 1 * arg1);
output[1] = sprintf("Ergebnis: %d", 2 * arg1);
output[2] = sprintf("Ergebnis: %d", 3 * arg1);
}
Übrigens fehlt deiner Funktion die öffnende geschweifte Klammer. ;-)
Sooo - output ist also ein Zeiger auf einen Zeiger auf char. Da du in der Funktion über einen Index auf drei Elemente zugreifst, muss es ein Zeiger auf mindestens drei Zeiger sein, also etwa so:
char *ergebnis[3];
...
func(foo, ergebnis);
Dein Beispiel klemmt aber noch an einer anderen Stelle: Der Ergebnistyp von sprintf ist int, denn sprintf gibt die Anzahl der geschriebenen Zeichen zurück, nicht den erzeugten String. Dafür fehlt in deinem Aufruf von sprintf der erste Parameter, nämlich der Puffer, wo sprintf den erzeugten String hinschreiben soll. Das ist ein wesentlicher Unterschied zur sprintf-Implementierung z.B. in PHP.
char str[60];
int anzahl;
anzahl = sprintf(str, "Konstante: %u", 400);
Dieser Codeausschnitt erzeugt in str[] die Zeichenkette "400" und ein abschließendes Nullbyte (die restlichen 56 Zeichen bleiben ungenutzt), und gibt den Wert 3 an anzahl zurück. Beachte den ersten Parameter, der angibt, wo sprintf den String hinschreiben soll.
Schönen Sonntag noch,
Martin
"Drogen machen gleichgültig."
- "Na und? Mir doch egal."