Re: Anfängerfrage: Absturz bei malloc



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!
.



Relevant Pages

  • Re: Object in StringListen und ListBox
    ... Und der zum Pointer verwandelte Index der Originalliste. ... > dann auf eine draufklicken können um Sie zu korrigieren. ...
    (de.comp.lang.delphi.misc)
  • Re: welche werkzeuge zum programmieren und/oder welche IDE ?
    ... Sie bestehen aus pointer auf irgendwas z.B. ... und aus 2 int-Werten, gebrauchter letzter index ... und allozierter Index. ...
    (de.comp.os.unix.programming)
  • Re: welche werkzeuge zum programmieren und/oder welche IDE ?
    ... Sie bestehen aus pointer auf irgendwas z.B. ... und allozierter Index. ... mit der ich das array bei Bedarf vergrößern kann: ...
    (de.comp.os.unix.programming)
  • Re: Sub-Array
    ... internen) Index. ... pointer werden im context mit arrays in c# wirklich nichtmehr ... adresse des zweiten (n-ten) elementes... ...
    (microsoft.public.de.german.entwickler.dotnet.csharp)
  • Re: Liste mit zwei Indexen?
    ... oder eine verkettete Liste, vom Datensatz zum ersten Index, von dort zum nächsten Index usw. ... nur eine Liste mit zwei Indexen. ... Baue bidirektional verkette Listen auf, dann haben alle Elemente feste Adressen, solange sie leben. ...
    (de.comp.lang.delphi.misc)