Rückgabe von Zeigern aus Funktionen

24/01/2009 - 03:10 von Ottmar Ohlemacher | Report spam
Hallo,

ich bin da auf eine Merkwürdigkeit gestoßen, dich ich nicht ganz verstehe,
und zwar folgende beiden Beispiele:

1.) Dieses Beispiel funktioniert.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 255
char *eingabe() {
char input[MAX];
char *doof;
printf("Bitte qqqqaaaa eingeben: ");
fgets(input, MAX, stdin);
doof = &input[0];
return doof;
}
int main(void) {
char *ptr;
ptr = eingabe();
printf("Hallo %s", ptr);
ptr = eingabe();
printf("%s, interssanter Nachname", ptr);
return EXIT_SUCCESS;
}

2.) Dieses Beispiel funktioniert nicht!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 255
char *eingabe() {
char input[MAX];
char *doof;
printf("Bitte qqqqaaaa eingeben: ");
fgets(input, MAX, stdin);
doof = &input[0];// in dem Beispiel überflüssig
return &input[0];
}
int main(void) {
char *ptr;
ptr = eingabe();
printf("Hallo %s", ptr);
ptr = eingabe();
printf("%s, interssanter Nachname", ptr);
return EXIT_SUCCESS;
}

Wàhrend im ersten Beispiel der Zeiger "doof" zurückgegeben wird, wird
(sollte) im zweiten Beispiel die Adresse auf das nullte(erste) Element des
Arrays input zurückgegeben werden.


Wenn jetzt doof = &input[0] ist, dann sollte es doch imho egal sein, ob im
return der Funktion eingabe() nun die Adresse in der Zeigervariablen "doof"
oder in dem Term "&input[0]" zurückgegeben wird. Beide Ausdrücke
repràsentieren doch nur ein und die selbe Adresse.

Weshalb geht das nicht bzw wo mache ich da einen Denkfehler?

Danke für Info.

mfG Ottmar
 

Lesen sie die antworten

#1 Erich Fruehstueck
24/01/2009 - 06:01 | Warnen spam
Am Sat, 24 Jan 2009 03:10:13 +0100 schrieb Ottmar Ohlemacher:

Hallo,

ich bin da auf eine Merkwürdigkeit gestoßen, dich ich nicht ganz
verstehe, und zwar folgende beiden Beispiele:

1.) Dieses Beispiel funktioniert.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 255
char *eingabe() {
char input[MAX];
char *doof;
printf("Bitte qqqqaaaa eingeben: ");
fgets(input, MAX, stdin);
doof = &input[0];
return doof;
}
int main(void) {
char *ptr;
ptr = eingabe();
printf("Hallo %s", ptr);
ptr = eingabe();
printf("%s, interssanter Nachname", ptr); return EXIT_SUCCESS;
}

2.) Dieses Beispiel funktioniert nicht!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 255
char *eingabe() {
char input[MAX];
char *doof;
printf("Bitte qqqqaaaa eingeben: ");
fgets(input, MAX, stdin);
doof = &input[0];// in dem Beispiel überflüssig
return &input[0];
}
int main(void) {
char *ptr;
ptr = eingabe();
printf("Hallo %s", ptr);
ptr = eingabe();
printf("%s, interssanter Nachname", ptr); return EXIT_SUCCESS;
}

Wàhrend im ersten Beispiel der Zeiger "doof" zurückgegeben wird, wird
(sollte) im zweiten Beispiel die Adresse auf das nullte(erste) Element
des Arrays input zurückgegeben werden.

Wenn jetzt doof = &input[0] ist, dann sollte es doch imho egal sein, ob
im return der Funktion eingabe() nun die Adresse in der Zeigervariablen
"doof" oder in dem Term "&input[0]" zurückgegeben wird. Beide Ausdrücke
repràsentieren doch nur ein und die selbe Adresse.

Weshalb geht das nicht bzw wo mache ich da einen Denkfehler?



Beides ist undefiniertes Verhalten, da die Variable input nach verlassen
der Funktion eingabe nicht mehr gültig ist (automatische Variable).
Wenn du input mit static deklarierst, solltest Du in beiden Fàllen das
gewünschte Ergebniss erhalten.

PS: Anstelle von &input[0] kannst Du einfach input schreiben. Ein Array
wird in einem Ausdruck (auser beim sizeof und & operator) durch den
Pointer auf das erste Element ersetzt.

Grüße
Erich

EFEU 3.2 is released!
Get the open source from http://efeu.cybertec.at.

Ähnliche fragen