Re: Anfängerfrage: Absturz bei malloc
- From: "Herbert Rosenau" <os2guy@xxxxxxxxxxxxx>
- Date: Tue, 9 May 2006 19:35:16 +0000 (UTC)
On Tue, 9 May 2006 14:35:40 UTC, Haiko Cyriaks <hcy_nospam@xxxxxxx>
wrote:
Hallo,
ich habe seit Jahren mal wieder mit C zu tun (immer nur Java, Perl, PHP
etc. gemacht) und verzweifle jetzt an einem scheinbar trivialen Problem:
eine linerae dynamische Liste (Vector). Der Code sieht in etwas so aus:
typedef struct s *Index;
struct s
{
unsigned int sentence;
unsigned int position;
Index next;
};
Jetzt möchte ich ein Element in die Liste einfügen
Index ip;
ip = lFound->idx; // das ist das erste Element, das ist initialisiert
und ok
while (ip->next) { // zum Ende der Liste gehen
ip = ip->next;
}
ip->position = position;
ip->sentence = sentence;
Warum überschreibst Du das schon vorhandene Element?
ip->next = (Index) malloc(sizeof(*ip)); // und hier knallt mein
Programm (Absturz unter Windows)
Und hier verursachst Du undefined behavior. Warum? Du lügst dem
Compier irgendwas vor von dem Du nichtmal selber weißt was es ist.
Du hast vergessen stdlib.h zu uncluden und willst jetzt ein int (das
was nach Meinung des Compilers malloc zurück gibt) in einen Pointer
casten -> undefined behavior weil der Standard nicht garantiert
1. daß ein int von einer Funktion genau an dem selben Platz
zurückgegeben wird an
dem ein Pointer zurückgegeben wird
2. ein Pointer immer und unter allen Umständen genauso groß wie ein
int ist.
eine der Möglichkeiten alleine führt schon zu irgendwas, nur nicht zu
dem was Du denkst
Ich finde einfach den Denkfehler nicht - in allen Büchern steht's doch
so drin oder hab' ich was übersehen.
Die jetzt besorgte struct enthält auch noch kompletten Schrott - unter
anderem ist ip->next->next untertimined, heißt es entäält alles, nur
nicht NULL, somit ist der nächste Durchlauf garantiert kaputt. Wenn Du
Glück hast, knallt schon while() und weißt Dich darauf hin - wenn Du
Pech hast, geht eben genau die Speicherung des Ergebnisses von malloc
daneben.
Richtig:
index temp;
.....
temp = malloc(sizeof(*ip));
if (temp) {
temp->position = position;
temp->sentence = sentence;
temp->next = NULL;
ip->next = temp;
} else {
/* Fehler! malloc kann keinen Speicher liefern */
}
--
Tschau/Bye
Herbert
Visit http://www.ecomstation.de the home of german eComStation
eComStation 1.2 Deutsch ist da!
.
- References:
- Anfängerfrage: Absturz bei malloc
- From: Haiko Cyriaks
- Anfängerfrage: Absturz bei malloc
- Prev by Date: Re: strlen machts nicht wie erwartet
- Next by Date: Re: strlen machts nicht wie erwartet
- Previous by thread: Re: Anfängerfrage: Absturz bei malloc
- Next by thread: strlen machts nicht wie erwartet
- Index(es):
Relevant Pages
|