Structur mit Rückgabe

Gast #2010868
Lesenswert?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct person {
char *name;
int alter;
};

struct person *erzeuge(char *name, int alter) {
struct person temp;
strcpy(temp.name, name);
temp.alter = alter;
 return  &temp;

}
void main(void) {
struct person *p;
p = erzeuge("Meier", 25);

printf("Name: %s, Alter: %d\n", p->name, p->alter );

}


Find den Fehler meines Programms nicht, weiß jemand woran das liegt...
#2010871
Lesenswert?

Ein Programm ist richtig, wenn es deine Anforderungen erfüllt.
Solange du keine benennen kannst und sagst, inwiefern es die
Anforderungen nicht erfüllt, ist es richtig.

Der einzige Fehler daran ist die fehlende Formatierung, die
ist nämlich Pflicht, wenn andere das lesen sollen.
#2010874
Lesenswert?

Murry schrieb:

> Find den Fehler meines Programms nicht, weiß jemand woran das liegt...


Nur weil du eine Pointer Variable hast, hast du noch lange nicht den 
Speicher auf den dieser Pointer zeigen könnte um darin etwas abzulegen

struct person temp;
strcpy(temp.name, name);


temp.name ist nur ein Pointer. Dahinter steckt kein Speicher (kein 
char-Array) in dem der Name gespeichert werden könnte. Du als 
Programmierer bist dafür verantwortlich, dass dieser Pointer auch auf 
tatsächlichen Speicher zeigt und nicht einfach nur ins Nirvana.

 return  &temp;

Die Adresse einer lokalen Variablen zurückgeben ist der nächste Punkt 
für ein sicheres Desaster.
#2010878
Lesenswert?

Ansonsten lieferst du die Adresse einer lokalen Variable zurück.
Das ist meistens falsch, wenn das Programm nicht nicht abstürzen
soll.
Deshalb steht in jedem C-Buch, daß man das nicht machen
soll und der gcc erzeugt eine Warnung.
Falls du bestimmte Anforderungen an die Funktionsfähigkeit
deines Programms hast, solltest du solche Warnungen nicht
ignorieren (und immer mir -Wall kompilieren, falls du den gcc
nimmst).
#2010880
Lesenswert?

U.R. Schmitt schrieb:
> Karl heinz Buchegger schrieb:
>> strcpy(temp.name, name);
>
> Das hatte ich gar nicht gesehen.
> Dein Lieblingsspruch: Er braucht ein gutes C-Buch :-)

Allerdings.
In so wenig Code 2 derart schwerwiegende Fehler. Und keinen davon selber 
gesehen.

Das schreit förmlich danach, dass hier wieder mal wer ohne Literatur 
unterwegs ist.

(Und natürlich wieder eine scheusliche Code-Formatierung)
#2010907
Lesenswert?

Murry schrieb:
>>> Dein Lieblingsspruch: Er braucht ein gutes C-Buch :-)
>
> Das heißt mit anderen Worten wenn jeder ein C-Buch hat braucht man kein
> Forum mehr.

Nein das heißt es nicht.
Auch in einem C-Buch werden immer Detailfragen offen bleiben.

Aber: Wer ein C-Buch hat und es systematisch durcharbeitet, fällt nicht 
mehr auf jeden Pipifax herein.
Ein Forum ist kein Ersatz für das Erlernen der absoluten Grundlagen. 
Denn sonst bräuchte man keine Bücher mehr, sondern ein paar Dodeln 
schreiben dir in 5 jeweils 30 zeiligen Postings die Kurzfassung dessen, 
wozu ein Buch 250 Seiten braucht.

Schon mal überlegt, warum wohl ein C-Buch nicht unter 200 Seiten 
wegkommt? Das wird ja wohl kaum so sein, dass dem Autor fad gewesen wäre 
und er deshalb die Seiten irgendwie gefüllt hat.

> Ja und wie schreibt man es jetzt am besten um...

So dass es richtig ist.
Wie es richtig ist, steht in jedem, und ich meine jedem, C-Buch.
Und zwar schon lange vor dem Kapitel an dem dann Strukturen auftauchen! 
Denn das ist nämlich das eigentlich interessante an der Sache. Wer so 
weit fortgeschritten ist, dass er zu Strukturen kommt, sollte zb mit 
Stringverarbeitung eigentlich überhaupt keine Problemen mehr haben.

Nicht nur, dass du kein Buch hast. Du hast auch noch midestens die 
Hälfte aller nicht gelesenen Kapitel übersrpungen und wunderst dich 
jetzt, dass alles auf dich hereinstürzt. Da will ich erst gar nicht 
wissen, was du noch alles nicht weißt.
Gast #2010919
Lesenswert?

Danke für die aufbauenden Worte.
> Nicht nur, dass du kein Buch hast. Du hast auch noch midestens die
> Hälfte aller nicht gelesenen Kapitel übersrpungen und wunderst dich
> jetzt, dass alles auf dich hereinstürzt. Da will ich erst gar nicht
> wissen, was du noch alles nicht weißt.

Aber jetzt mal ehrlich, wie kann man es am besten umschreiben
#2010922
Lesenswert?

Indem man die angesprochenen Dinge bereinigt.

Du brauchst Speicher um einen String zu speichern.

Hier ist er zb
1
struct person {
2
  char name[20];
3
  int alter;
4
};

Dann geht schon mal der strcpy.

Du kannst nicht die Adresse einer lokalen Variablen zurückgeben.
Na dann tus einfach nicht!
1
struct person erzeuge(char *name, int alter)
2
{
3
  struct person temp;
4

5
  strcpy(temp.name, name);
6
  temp.alter = alter;
7

8
  return temp;
9
}

Ob das 'die beste Lösung' ist sei dahingestellt. Aber zumindest ist es 
eine Lösung die funktioniert.

Und das war jetzt so schwer?


(Eine Änderung musst du noch machen. Aber die machst jetzt du. Denn du 
sollst ja schliesslich auch etwas dazu beitragen, ausser dass du dir 
möglichst rasch ein Buch kaufst und das Versäumte nachholst)
Gast #2011028
Lesenswert?

> (Und natürlich wieder eine scheusliche Code-Formatierung)

Wie geht sowas eigentlich?

Ich benutze ja Emacs und das sorgt von sich aus schonmal fuer
eine gewisse Grundformatierung und ich dachte bisher
das soetwas der Normalfall ist auch bei irgendwelchen
integrierten Oberflaechen.

Und erzaehl mir jetzt keiner die Anfaenger schreiben ihre Programme in 
Word. :-D

Olaf
#2011039
Lesenswert?

Olaf schrieb:
>> (Und natürlich wieder eine scheusliche Code-Formatierung)
>
> Wie geht sowas eigentlich?

Wenn man sich bemüht, bekommt man auch mit dem EMACS und jeder
IDE einen gruseligen Quelltext hin.
Hier war es wahrscheinlich aber im Editor noch gar nicht so
schlimm; dann muß man zumindest auf
1
[c]
2
...
3
[/c]
verzichten, um es zu schaffen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren