Christian Seiler: Einige C-Fragen

Beitrag lesen

Hallo!

Jetzt hätte ich noch eine Frage: Ich habe eine Funktion deren Signatur folgendermaßen aussieht

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);
}

Aua, das ist GANZ BÖSE! sprintf() hat folgende Signatur:

int sprintf (char *puffer, const char *format, ...);

Das heißt: Du gibst als ersten Parameter Deinen Puffer hinein und danach alle Parameter, die printf() selbst erwartet. [1] Als Rückgabewert erhälst Du die Anzahl an geschriebenen Zeichen.

sprintf() ist in C aber auch böse, weil auch hier wieder keine Bereichsprüfung stattfindet. Du möchtest hier folgendes machen:

void func(int arg1, char **output, size_t buflen) {  
  snprintf(output[0], buf, "Ergebnis: %s", 1 * arg1);  
  snprintf(output[1], buf, "Ergebnis: %s", 2 * arg1);  
  snprintf(output[2], buf, "Ergebnis: %s", 3 * arg1);  
}

Der zusätzliche Parameter buflen würde hier dann angeben, wie groß der Puffer ingesamt ist, damit er nicht überschrieben wird. snprintf() prüft im Gegensatz zu printf() wieder die Puffergröße.

Wie initialisiere ich nun char** output vor der Übergabe an die Funktion richtig, damit ich keinen Speicherzugriffsfehler erhalte?

Du willst ein Array mit 3 Elementen, die eine bestimmte Puffergröße haben:

#define PUFFERGROESSE 200  
  
// ...  
  
// Ein Array mit 3 char*-Pointern allozieren  
char **output = (char **)malloc(sizeof(char *)*3);  
int i;  
// Nun im Array 3 Puffer anlegen  
for (i = 0; i < 3; i++) {  
  output[i] = (char *)malloc(PUFFERGROESSE);  
}  
// Nun übergeben  
func (15, output, PUFFERGROESSE);  
  
// nun irgendwas mit output machen  
  
// Nun wieder loswerden  
for (i = 0; i < 3; i++) {  
  free (output[i]);  
}  
free (output);

Viele Grüße,
Christian

[1] In PHP (Scriptsprache!) gibt's ein sprintf(), das eine Zeichenkette *zurückgibt*, das ist aber in der internen C-Implementierung relativ komplex gebaut (und es gibt in der C-Standardbibliothek kein Äquivalent dafür), verwechselst Du das evlt. damit?