PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : speicher resevierungsproblem in c



03.12.2004, 14:41
hallo ich offe mir kann jemand helfen ich kann icn den fogenden progamm
kein speicher resevieren für meine tabbelle von datentyp student
es soll die methode den speicher reservieren
ich weis nicht mehr warum da nicht klappt compiler sagt immer

teste.c(26) : warning C4013: 'malloc' undefiniert; Annahme: extern mit Rueckgabetyp int

erlich gesagt weis ich micht was er meint der compiler


#include<stdio.h>
typedef struct stud{
char vorname[20];
char name[20];
int matnr;
float note[3];
} STUDENT;

typedef struct tabelle{
int max;
int anzahl;
STUDENT *tab;
}TABELLE;


void init_tap(TABELLE *pt,int max){
pt->max = anzahl;
pt->anzahl = 0;
pt->tab = (STUDENT *) malloc(anzahl*sizeof(STUDENT));

}
int main(){

TABELLE *t1=NULL;


init_tap(t1,5);




}

PicNick
03.12.2004, 15:26
Fehlt offenbar irgendeine Include-datei.
Schau mal mit "SEARCH for TEXT" eine Suche nach "malloc" in dem Directory, wo sich auch stdio.h steht.
Zumindest bei mir (VC+++++, entenschei...Edition) gibst ein
#include <malloc.h>
vielleicht hilft's ja mfg robert

03.12.2004, 20:16
ja danke erst mal aber daran hat es auch nicht gelegen es wird immer noch kein speicher reserviert

Joerg
03.12.2004, 20:23
Du brauchst den stdlib-header.

#include <stdlib.h>

HTH und Viele Grüße
Jörg

PicNick
03.12.2004, 20:25
Sehr seltsam, diese Fehlerkombination.
Was kriegst du denn vom malloc zurück ? -1 ? oder 0 ?
(ev. printf einbauen)
Schau im Help nach. Vielleicht braucht die Schweinebacke irgendeine Heap-Initialisierung. mfg robert

Hopperla: im malloc(anzahl * sizeof(xx)) fehl mir das pt->

soll so ausschauen malloc(pt->anzahl * sizeof.....)

wenn anzahl = 0, weil er gar nicht "deine" anzahl in der structure nimmt.
kriegst du natürlich auch nix (---> printf von pt->anzahl zu Kontrolle)

03.12.2004, 22:19
hi leider ist das auch nicht der fehler
wenn ich in der main nur mal für meine variable TABELLE *t1
ein speicherplatz resevieren will macht er das auch nicht
ich bekomme immer den fehler speicherplatz 0x00000000 write konnte nicht durchgefürt werden ??????????????????
allerdings weiß ich auch nicht was ein heap ist?

t1->tab = (STUDENT *) malloc(sizeof(STUDENT));

03.12.2004, 22:29
achso malloc gibt mir wenn ich es mit printf ausgebe
printf(" malloc ist:%d \n",(STUDENT *) malloc(sizeof(STUDENT)));
auf im test eine adresse ungleich null aus zb"0.x0040108e" aus
sagt aber immer noch fehler adr. "0.x0040108e" verweist auf speichplatz
"0x00000000 "write konnte nicht durchgefürt werden

04.12.2004, 10:18
Schau, mal, da dampft es ein bißchen:
wenn du init_tap anspringst mit der Adresse von TABELLE, ist diese Adresse NULL (TABELLE *t1=NULL)
Der malloc will nun sein ergebnis dorthin schreiben (nach pt->tab) und das ist im Nirwana.

SCHREIBE folgendes (übergenau für meschuggene Compiler)


void init_tap(TABELLE *pt,int max)
{
pt->max = max;
pt->anzahl = 0;
pt->tab = (STUDENT *) malloc(pt->max*sizeof(STUDENT));
}
int main()
{
TABELLE t1; // KEIN * , die Structur ist tatsächlich da

init_tap((TABELLE *)&t1,5); // &t1 ist die Adresse von tabelle

...

VARIANTE 2:

int main(){

TABELLE *t1 = (TABELLE *)malloc(sizeof(TABELLE)); // malloc #1

init_tap((TABELLE *)t1,5); // malloc #2

Du wirst sehen, dann klappts auch mit der Nachbarin
mfg Robert

04.12.2004, 17:07
alles klar es geht auch so das problem war einfach in der methoden def.
unzwar muss malloc als erstes in der methode stehen weil sonst er versucht auf die variabln zuzugreifen die noch nicht da sind vielen dank hier ihr seid echt fit
#include<stdio.h>
#include<malloc.h>
typedef struct stud{
char vorname[20];
char name[20];
int matnr;
float note[3];
} STUDENT;

typedef struct tabelle{
int max;
int anzahl;
STUDENT *tab;
}TAB;

return 0;
}
void init_tap(TAB *pt,int max){
pt = (TAB *)malloc(max*sizeof(TAB));
pt->max = max;
pt->anzahl = 0;
}
int main(){
TAB *t3;

init_tap(t3,5);
}
so klapps auch denke der einfachste weg

04.12.2004, 17:19
shit es klappt nur halb die methode reserviert zwar den speicherplatz
aber sobald sie methode beendet ist und ich wieder in der main()
bin ist der zugeteilte speicher wieder verloren verstehe ich nicht

PicNick
04.12.2004, 17:37
Logo, du läßt ihn ja das resultat in den Stack (Nirwana) stellen, dort wo die call-parameter stehen Nach dem return sin die wieder weg.

Wirklich elegant (und ergebnisreich) wäre folgendes:

TAB* init_tap(int max)
{
TAB *temp = (TAB*)malloc(blah blah);
temp->max = max;
temp->anzahl = 0;
return(temp);
}

main()
{
TAB *t3 = init_tab(5);

....

mfg robert (es geht natürlich auch mit "Pointer of pointer", aber man sollt nix übertreiben)