Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » malloc - fehler bei erzeugung von speicherplatz

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
20.01.2004, 11:31 Uhr
matmalign



nach der eingabe des users soll der speicherbereich reserviert werden

C++:
Sroot = (struct Worte*)malloc(sizeof(struct Worte));


zurvor frage ich jedoch noch ab ob malloc den gewünschten Speicherbereich überhaupt anlegen kann

C++:
if (((struct Worte*)malloc(sizeof(struct Worte))) == NULL)


für den Fall die Bedingung wird true soll folgende fehlermeldung in der Konsole ausgegeben werden

C++:
system("Cls");
printf("FEHLER! Der Speicherbereich kann nicht angelegt werden!\n");
printf("Versuchen Sie eine kürzere Eingabe: ");


scheinbar geht der compiler gar nicht erst in die if-anweisung! Das Programm wird bei eingabe eines zu langen Stings mit 'access violation' beendet


Hier noch einmal der Quelltextabschnitt:

C++:
do{
gets(s);                  // Satz einlesen
if (((struct Worte*)malloc(sizeof(struct Worte))) == NULL)
{
system("Cls");
printf("FEHLER! Der Speicherbereich kann nicht angelegt werden!\n");
printf("Versuchen Sie eine kürzere Eingabe: ");
}
else
Sroot = (struct Worte*)malloc(sizeof(struct Worte));
} while (Sroot == NULL);




Bearbeitung von Pablo:

CPP TAGS selber benutzen!


Dieser Post wurde am 20.01.2004 um 11:41 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.01.2004, 11:37 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


aua...

if (((struct Worte*)malloc(sizeof(struct Worte))) == NULL)

da allokierst du speicher und weist das ja keinem pointer zu üble sache...

das in ne whileschleife zu packen wird nicht viel helfen weil wenns schon beim ersten mal nicht klappt ist wohl kein speicher da...da wird dann mit recht hoher wahrscheinlichkeit ne endlosschleife draus werden sollte mal nicht genug speicher da sein...

ich weiss ja nicht genau was du da mit dem struct "Worte" machen willst...


C++:
if ((Sroot =(struct Worte*)malloc(sizeof(struct Worte))) == NULL){
system("Cls");
printf("FEHLER! Der Speicherbereich kann nicht angelegt werden!\n");
}else{
//hier läuft dein proggie weiter
.
.
.
}



--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 20.01.2004 um 11:45 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.01.2004, 11:46 Uhr
Pablo
Supertux
(Operator)



C++:
if (((struct Worte*)malloc(sizeof(struct Worte))) == NULL)



ist wie Windalf sagte, der Fehler. Denn malloc reserviert nochmal den Speicher, aber der wird nie frei gegeben werden, denn du bist nicht in der Lage free aufzurufen.

Was du überprüfen sollst, ist ob Sroot NULL ist, nachdem du malloc benutzte hast.

C++:
if (NULL == Sroot) {...} ...



Tipp:
Das sieht nach C aus. Damit du dir immer das lästige struct ersparen kannst, tue folgendes:

C++:
typedef struct _W {
    // hier deine Definition des Strcuts Worte
} Worte;



Dann brauchst du nicht mehr immer struct mitzuschreiben.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 20.01.2004 um 11:47 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.01.2004, 11:47 Uhr
matmalign



Hm... funktioniert immer noch nicht

ich schreibe dir den Quelltext mal bis zum Ende der zweiten 'do while' schleife komplett


C++:
#include <stdio.h>
#include <malloc.h>

struct Worte {                       // Wortliste
struct Wort2Buchstabe * buchstaben;
struct Worte *          next;  
};

//Liste mit Pointern auf die Buchstaben des
//                       jeweiligen Wortes.
struct Wort2Buchstabe {  
struct Buchstaben *     buchstabe;
struct Wort2Buchstabe * next;
};

struct Buchstaben {                  // Buchstabenliste
char                c;
struct Buchstabe2Wort * worte;
struct Buchstaben *     next;
};

//Liste mit Pointern auf die Worte die den
//        jeweiligen Buchstaben enthalten.
struct Buchstabe2Wort {
struct Worte *          wort;
struct Buchstabe2Wort * next;
};

void main() {

int n;
struct Wort2Buchstabe* w2b = NULL; //Zeigt Listenende der Buchstaben des Wortes
struct Buchstabe2Wort* b2w = NULL;
struct Buchstabe2Wort* bb = NULL;
struct Worte* Sroot = NULL;
struct Worte* Shp   = NULL;
struct Buchstaben* Broot = NULL;  //root der Buchstaben ("B")
struct Buchstaben* Bhp   = NULL;  //Hilfszeiger
void* hp;

char s[80];               // Variable für Eingabe
char c_last;

do{
printf("\n\n");
do{
gets(s);                  // Satz einlesen
if ((Sroot =(struct Worte*)malloc(sizeof(struct Worte))) == NULL){
// Für den Fall dass malloc den benötigten Speicherbreich nicht erzeugen kann
system("Cls");            // erscheint eine Fehlermeldung mit erneuter Eingabeaufforderung
printf("FEHLER! Der Speicherbereich kann nicht angelegt werden!\n");
printf("Versuchen Sie eine kürzere Eingabe: ");
} else
Sroot = (struct Worte*)malloc(sizeof(struct Worte));
}while (Sroot == NULL);

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.01.2004, 11:55 Uhr
matmalign



kann es vielleicht an dem erzeugten array liegen das maximal nur 80 zeichen aufnimmt und falls ich 81 zeichen eingebe fliegt der einfach raus?

man bin ich blöde?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.01.2004, 11:58 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ich habe da den eindruck du machst dir das ein bisschen zu kompliziert...
ein normaler char-buffer sollte ausreichen das muss man sich nicht extra mit listen und der ganzen allokiererei rumärgern...
wenn du nachher die wörter aus dem char-array herausbekommen willst hilft dir die funktion strtok ungemein...

so und nochmal zu dem malloc


C++:
if ((Sroot =(struct Worte*)malloc(sizeof(struct Worte))) == NULL){
// Für den Fall dass malloc den benötigten Speicherbreich nicht erzeugen kann
system("Cls");            // erscheint eine Fehlermeldung mit erneuter Eingabeaufforderung
printf("FEHLER! Der Speicherbereich kann nicht angelegt werden!\n");
printf("Versuchen Sie eine kürzere Eingabe: ");
} else
Sroot = (struct Worte*)malloc(sizeof(struct Worte));
}while (Sroot == NULL);



das ist wieder ganz übel weil du ja nochmal malloc aufrufst obwohl du das schon in der bedinung getan hast...

Sroot = (struct Worte*)malloc(sizeof(struct Worte)); muss weg...
Sroot hat ja schon speicher zugewiesen bekommen so es nicht auf Null zeigt und an diesem punkt des programmes kannst du dir ja sicher sein das es nicht auf Null zeigt weil du das ja schon vorher abgefragt hast...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.01.2004, 12:00 Uhr
matmalign



ok - hab grad nen text durchgeführt - es liegt tatsächlich an der größe des arrays - trotzdem vielen dank für eure hilfe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.01.2004, 14:03 Uhr
Pablo
Supertux
(Operator)



C++:
Sroot =(struct Worte*)malloc(sizeof(struct Worte));



Ist dir klar, dass das nur Speicher für ein Element reserviert? also nur für Rsoot[0]; Wenn du mehr brauchst, z.b. 80, dann musst du

C++:
Sroot =(struct Worte*)malloc(sizeof(struct Worte)*80);



aufrufen.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.01.2004, 14:20 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
Pablo postete
...

C++:
typedef struct _W {
    // hier deine Definition des Strcuts Worte
} Worte;


...


Dir ist klar, daß der code nicht protabel ist? - Und das ohne Not! - _W ist ein für die Implementierung reservierter Bezeichner und im übrigen vollkommen überflüssig für Deine Zwecke!
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.01.2004, 14:26 Uhr
Pablo
Supertux
(Operator)


Ok, stimmt, das habe ich vergessen, dass ich _ nicht benutzen soll. Aber was ist überflüssig, die Benutzung von _W oder von typedef?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: