P
Hallo,
Du musst das so sehen:
int **matrix = 0; // = NULL
Mit dieser Zeile deklarierst Du, wie es für eine einfache Matrix auch richtig ist, einen Zeiger, auf einen Zeiger, auf einen Integer. Somit erhälst Du eine quasi zweidimensionale Matrix - soweit ist das ja korrekt. Was Du damit bis jetzt jedoch erreichst ist nur, dass Du dem Programm sagst, dass es eine Matrix gibt, aber nicht was da drin steht, geschweigedenn wo sie sich überhaupt im Speicher Deines Rechners befindet.
Da wir Dir geraten haben Deine Variablen zu initialisieren, hast Du das '= 0;' dahinter geschrieben. Wird das hier so an dieser Stelle gemacht, legst Du gleichzeitig fest, auf welche Stelle im Speicher Dein Pointer zeigen soll - in diesem Fall NULL, was salopp ausgedrückt so viel bedeutet wie "in ein schwarzes Loch".
Wenn Du Dir mal ganz kurz Deine mat1() anschaust, siehst Du, wie Du neuen Speicher reservierst und gleichzeitig die Postition Deiner Matrix festlegst:
matrix = new int* [dim1];
for (i = 0; i < dim1; i++)
matrix[i] = new int[dim2];
Zuerst allokierst Du Speicher für Deine erste Dimension der Matrix, dann läufst Du mit der Schleife durch jede durch, und allokierst die Zweite. Somit ist in dem Fall Deine Matrix fest definiert (die Werte die da jetzt aber defacto drinstehen sind zu diesem Zeitpunkt unwillkürlich).
Noch einmal zurückgesprungen zu Deiner Deklaration in addmatrix() fehlt diese Speicherzuordnung völlig. Du verwendest praktisch etwas, was garnicht, oder besser ausgedrückt irgendwo wo es nicht zu finden ist, verwendest.
Ich habe jetzt zwei Gedanken:
Du hast einfach vergessen die Pointer Deiner Matrix irgendwo hin zu legen, oder
Du hattest Dir gedacht, dass die Variablen in Deiner mat1() und der addmatrix() ein und diesselben sind. Das ist allerdings ein falscher Gedanke, denn sie teilen sich nur den Namen, nicht den Speicherbereich. Du könntest, falls ich mit dieser Vermutung richtig liege, besagte Variablen entweder global deklarieren, damit sie im gesamten Namensraum gelten unabhängig vom Gültikeitsbereich der Funktionen, oder Du übergibst die Pointer mittels Rückgabewerten und Übergabeparametern irgendwie von mat1() nach addmatrix().
P.S.: Jedesmal, wenn Du mit dem new-Operator Speicher allokierst, passiert das dynamisch - er wird auf dem Heap anstatt auf dem Stack abgelegt. Solange Du keine "intelligenten" Zeiger verwendest (was Du hier nicht machst), bist Du selber dafür verantwortlich, dass dieser Speicher wieder freigegeben wird sobald Du ihn nicht mehr benötigst. Tust Du das nicht frisst Dir Dein Programm bei jeder Ausführung immer etwas Speicher weg ohne dass es ihn wieder hergibt. Bei Deinem kleinen Programm jetzt nicht unbedingt schlimm, aber bei größeren Projekten wirklich fatal. Freigeben kannst Du den Speicher mittels dem Operator delete und seinem Derivat delete[]:
#define SIZE 128
int *i = new int; // Speicher wird allokiert
int *i2 = new int[SIZE]; // Speicher wird allokiert
delete i; // Speicher wird freigegeben
delete[] i2; // Speicher wird freigegeben
und die Anmerkung von unskilled: Recht hat er
EDIT: Und drakon hat recht. Gerade Zeiger sind ein essentielles aber genauso komplexes Thema. Wenn Du da unsicherheiten hast, versuche einige kleinere Übungen mit Pointern und Referenzen.