PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : malloc und sigsegv



Puh-Bert
22-03-2002, 23:40
Hi

Ich hab da ein kleines C-Problem. Der Code sieht wie folgt aus:

int max = 60;
int *daten;
if ( ( daten = (int *) malloc ( max * sizeof(int) )) == NULL)
exit (1);
for ( ; max > 0 ; max-- )
*(daten +(max*sizeof(int)) ) = max;

Dieser Teil des Codes soll den allozierten Speicher auf den 'daten' zeigt
mit den Werten 1 bis 60 (bzw. bis zu dem Wert von max) füllen. Bei Werten von 'max' bis 70 klappt das auch.
Bei grösseren Werten kriege ich einen SIGSEGV.
Hab ich da jetzt nen Denkfehler drin? Was ich nicht ganz raffe ist warum
es bei kleinen Werten für 'max' hinhaut und bei grösseren nicht?! Selbst bei
einem Wert von 100 reserviert malloc doch gerade mal 400Bytes - sollte doch nicht zuviel sein (hab genug RAM ;-))

Puh-Bert

Doc Maverick
23-03-2002, 00:21
Hi,
Dein Fehler liegt wahrscheinlich darin, daß du
*(daten +(max*sizeof(int)) ) = max;

anstelle von
*(daten +max ) = max;

aber ich empfehle Dir eine etwas übersichtlichere Form:
daten[max]=max;

Bei kleineren Arraylängen ist die Wahrscheinlichkeit nicht so hoch, daß fremder Speicher überschrieben wird, weshalb die Sache in einem Bereich von 4*70*4 Bytes vielleicht noch klappt...
Tschüß.

anda_skoa
23-03-2002, 11:12
Du schreibst immer auf ungültige Adressen hinter dem Speicherplatz.

Wenn du wee Doc Maveric vorgeschlagen hat die array Schreibweise benutzt hättest, wäre es dir auch leichter aufgefallen, dass
daten[max] bei max= 60 bereits eins zuweit ist.

Ciao,
_

Puh-Bert
23-03-2002, 12:19
Danke erst mal für Eure Antworten!

Kann ich denn, wenn ich mittels malloc und dem Zeiger 'daten' Speicher alloziert habe,
diesen mit der Arrayschreibweise ansprechen? Funktioniert die Zeigerarithmetik bei der Schreibweise " *(daten + x ) " genauso wie bei der eines Arrays, z.B.
daten[x]? Ich hatte eigentlich angenommen, dass ich bei der ersteren Schreibweise im Gegensatz zur Arrayschreibweise, die Grösse des zugrunde liegenden Variablentyps berücksichtigen müsste.

Danke

Puh-Bert

P.s.: Bin noch ziemlicher C-Newbie ....

Puh-Bert
23-03-2002, 15:11
Hallo nochmal

Ich hab gerade ein wenig rumprobiert und dabei haben sich die Fragen aus meinem letzten Posting gelöst - jetzt funktionierts!

Vielen Dank für die Hilfe!

Puh-Bert