Archiv verlassen und diese Seite im Standarddesign anzeigen : speicher resevierungsproblem in c
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);
}
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
ja danke erst mal aber daran hat es auch nicht gelegen es wird immer noch kein speicher reserviert
Du brauchst den stdlib-header.
#include <stdlib.h>
HTH und Viele Grüße
Jörg
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)
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));
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
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
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
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
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)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.