Entweder verstehe ich hier etwas nicht oder das Beispiel ist fehlerhaft.
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Fehler Funktion gibt die Adresse
* einer lokalen Variablen zurück. */
char *test1(void){
char buffer[10];
strcpy(buffer, "testwert");
return buffer;
}
/* Möglichkeit1: Statische Variable */
char *test2(void){
static char buffer[10];
strcpy(buffer, "testwert");
return buffer;
}
/* Möglichkeit2: Speicher vom Heap verwenden */
char *test3(void){
char *buffer = (char *) malloc(10);
strcpy(buffer, "testwert");
return buffer;
}
/* Möglichkeit3: Einen Zeiger als Argument übergeben */
char *test4(char *ptr){
char buffer[10];
ptr = buffer;
strcpy(buffer, "testwert");
return ptr;
}
int main(void){
char *ptr;
ptr = test1();
printf("test1: %s\n", ptr); // meistens Datenmüll
ptr = test2();
printf("test2: %s\n", ptr);
ptr = test3();
printf("test3: %s\n", ptr);
test4(ptr);
printf("test4: %s\n", ptr);
return EXIT_SUCCESS;
}
Nur ergibt die Funktion test4 (Möglichkeit3) für mich aus folgenden Gründen keinen Sinn:
- Die Funktion nimmt zwar einen char pointer entgegen, nur wird der Parameter dabei bereits in der zweiten Zeile mit einer neuen Adresse überschrieben (die Adresse von buffer). Die Adresse, die bei Funktionseintritt an *ptr übergeben wurde, wird gar nie genutzt.
- Das char array buffer ist wie bei Funktion test1 nur lokal und hat damit die Lebensdauer auto. Die Speicheradresse wird ungültig, sobald die Funktion verlassen wird.
- Der Funktions-Parameter char *ptr ist komplett sinnlos. Ebenso gut hätte man buffer als pointer zurückgeben können - was ja unzulässig wäre, da die Lebensdauer des arrays buffer auto ist.
- Der zurückgegebene Pointer der Funktion test4 wird in der main Funktion überhaupt nicht "entgegen genommen".
Ich meine, man könnte natürlich einen Pointer an eine Funktion übergeben, um den entsprechenden Speicherbereich dann in der Funktion zu befüllen (dann wäre zudem der Rückgabetyp void sinnvoller). Nur müsste man dann zu Beginn auch tatsächlich Speicherplatz bereitstellen (auf dem Stack oder dem Heap). Einfach einen char Pointer in der Hauptfunktion deklarieren reicht ja nicht! Es ist ja schliesslich kein leeres char array! Gut, man könnte jetzt geltend machen, dass in der Funktion test3 auf dem Heap Speicher reserviert wurde und ptr nun auf diesen Bereich zeigt. Meiner Meinung nach suggerieren die Beispiele jedoch, dass sie für sich selbst stehen.
Unabhängig davon sehe ich aber nicht, wie die Funktion test4 so funktionieren sollte.
Übersehe ich hier etwas oder interpretiere ich etwas falsch? Oder ist vielleicht das Beispiel fehlerhaft?
Gruss, starcow