PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Programmierungs-Probleme


Einfachkrank
2003-05-08, 17:11:56
Hi,

ich hab in nem Programm, einen doppelten Pointer angelegt. Jetzt möchte ich daraus erst einen Aray mit Pointern anglegen und erst später dann weiter Arrays, also so:

int **ppitest;
// ...
*ppitest = new int[ARRAY1];
// ...
ppitest[irgendeiner] = new int[ARRAY2];
// ...
wobei ARRAY1 und ARRAY2 variabel sind. Später greife ich dann auf den Array so zu:

ppitest[EintragInArray1][StelleInArray2] = 10;
Jetzt wollt ich zunächst wissen, ob das so richtig ist? Das Programm verabschiedet sich dann immer beim Aufrufen, aber habe null Compilerfehler...

MFG Einfachkrank

Vedek Bareil
2003-05-09, 00:10:24
also ich würde darauf tippen, daß diese Konstruktion:

int **ppitest;
// ...
*ppitest = new int[ARRAY1];
falsch ist. Richtig sollte es so sein:

ppitest = new int*[ARRAY1]; Dadurch wird ein Array von int-Pointern dynamisch erzeugt, und ppitest auf die Adresse dieses Arrays gesetzt.
Durch deine nachfolgende Anweisung:
ppitest[irgendeiner] = new int[ARRAY2];
// ... wird dann ein Array von integers erzeugt, und das irgendeinerste Element des zuvor erzeugten Arrays von int-Pointern auf dieses neu erzeugte Array gesetzt.

Deine Konstruktion scheitert entweder daran, daß du einen Pointer dereferenzierst, der nirgendwo drauf zeigt (ich weiß nicht, ob das erlaubt ist). Oder wenn das kein Fehler ist, daran, daß ppitest auf diese Weise zu einem Pointer auf den Pointer *ppitest wird, der auf ein Array von integers zeigt, statt zu einem Pointer auf ein Array von int-Pointern. Infolgedessen gibt es das Element ppitest[igendeiner] nicht, da kein Array von int-Pointern existiert, von dem es ein Element sein könnte. Der Versuch, ppitest[igendeiner] aufzurufen, schlägt daher fehl und führt zum Absturz.

Daß der Compiler den Fehler nicht entdeckt, ist ganz normal, da der Ausdruck ppitest[igendeiner] ja syntaktisch völlig richtig ist. Das ist eine der Tücken von C/C++, daß solche Fehler beim Compilieren nicht auffallen.

Xmas
2003-05-09, 01:14:42
Vedek Bareil hat da ganz recht.
Die Zeile
*ppitest = new int[ARRAY1];
Weist ja nicht ppitest, sondern der Speicherzelle auf die ppitest zeigt die Adresse des angeforderten Speicherbereichs zu. Da der Pointer ppitest aber noch gar nicht initialisiert ist, wird die Adresse einfach irgendwo auf den Speicher geschrieben, was in den meisten Fällen eine Exception auslösen sollte.

Einfachkrank
2003-05-09, 16:17:12
:| achso, stimmt, das sollte ich mal probieren :)