Zeiger auf Structur für Speicherreservierung (malloc)
-
Hallo
Ich habe eine Struktur angelegt:struct kartei{
char name [20];
char status[1];
int semester;
datum d;
kartei *next;
};Nun möchte ich Speicher reservieren , ungefähr so:
int *erster;
erster=malloc(sizeof(kartei));Nur leider bekomm ich da ne fehlermeldung. was mache ich falsch??
Anschleißend würde ich dem Speicher auch gerne was zuweisen, doch das klappt auch nicht:
scanf("%s",(&erster.name));
Kann mir vll jemand weiter helfen? das wäre super.
Gruß
Jaepen
-
als erstes
schreib mal
typedef struct kartei kartei_karte;kartei_karte *erste = malloc(sizeof(kartei_karte));
Du kannst nämmlich nicht speicher so allokieren wie du das gemacht hast
int * ist ein int zeiger hinter seiner Adresse sollte ein int sein
kartei_karte * ist ein zeiger hinter seiner Adresse sollte kartei_karte sein
-
kartei_karte *erste = malloc(sizeof(kartei_karte));
wenn ich das schreibe bring er mir folgende nachricht:
C2676: Binaerer Operator '*' : 'struct kartei' definiert diesen Operator oder eine Konvertierung in einen fuer den vordefinier
wie muss ich denn erster deklarieren?
-
jaepen schrieb:
int *erster;
erster=malloc(sizeof(kartei));struct kartei *erster; erster = malloc (sizeof(struct kartei));
-
htte ich auch schon versucht, aber dann kommt folgender fehler:
error C2440: '=' : 'void *' kann nicht in 'struct kartei *' konvertiert werden
-
jaepen schrieb:
error C2440: '=' : 'void *' kann nicht in 'struct kartei *' konvertiert werden
Da hast du wohl einen C++-Compiler am Start.
-
Ja, richtig.
MS Visio C++.
geht das damit nicht? bis jetzt konnte der sonst auch alles.
Wie kann ich das Problem umgehen?gruß
-
sry, ich meinte MS Visual C++
-
struct kartei *erster = (struct kartei *) malloc (sizeof(struct kartei));
oder gleich C++, also new verwenden.
-
feigling schrieb:
oder gleich C++, also new verwenden.
besser nicht, damit handelt man sich nur noch mehr stress ein.
einfach die source code datei in .c umbenennen...
-
Endlich......
es funktioniert.Vielen vielen Dank
-
Hi
Hab noch immer ein paar probleme. und zwar findet er jetzt das ende meiner liste nicht, also dieses NULL.
woran liegt das?????temp=erster;
while (temp->next!=NULL)
{printf ("kontrolle");
fprintf(fp1,"%s \t %d \t %s \t %d.%d.%d\n ",(*temp).name,(*temp).semester,(*temp).status,(*temp).d.tag,(*temp).d.monat,(*temp).d.jahr);
temp=temp->next;
}
-
kann keiner einen fehler entdecken? der will nicht mehr aus der schleife raus gehen???
-
steppe durch den code. deine schleifenbedingung ist im a.
-
c.rackwitz schrieb:
steppe durch den code. deine schleifenbedingung ist im a.
wie meinst du das?
-
do { temp=temp->next; } while (temp != NULL);
muss klappen, is ja egal wie rum man macht. übrignes crackwitz meint deine schleifenbedingung ist im a-r-s-c-h falls dir das a kopfzerbrechen bereitet hat
PS: der überischtlichkeit halber verwende doch generell "temp->element" und bitte [cpp] tags.
-
Ja, mit dem a. war mir schon klar, wusste (weiß) nur nicht warum.
mit dem do while funktioniert leider auch nicht.
temp ist ein zeiger auf ein element einer liste. warum findet der nicht wenn es das letzte element ist?? oder muss ich das letzte element schon vorher irgendwie bestimmen?
-
Jaepen schrieb:
wie meinst du das?
wie meinst du das?
-
c.rackwitz schrieb:
Jaepen schrieb:
wie meinst du das?
wie meinst du das?
Rekursion ist hier nicht das Thema
-
kann ja wohl nicht angehen, dass hier einer "woran liegt das?????" schreit, sonst kein wort sagt was nicht verstanden wird, und dann auch noch hilfe bekommt!
und klar gehts hier um rekursion! was ist denn wohl ne verkettete liste?
im uebrigen ist ein do-while hier an sich falsch. warum?temp = erster; do... // crasht, wenn erster schon NULL ist, also ne leere liste vor einem liegt
die while() bedingung ist einfach falsch. das ->next muss weg.
warum macht nicht einfach mal einer nen eintrag in die FAQ "wie debugge ich richtig" und klatscht jedem das um die ohren, der denkt, sich die muehe nicht machen zu muessen?*mit-dem-krueckstock-fuchtel*