Speicherzugriffsfehler?
-
Hallo, ich habe mal eine Matrix programmiert und nun habe ich das Problem, das be der ersten for-Schleife for(_x=0; _x<n; _x++) bei der Ausgabe eine Zahl zu viel kommt, bei der 2. for-Schleife //for(_x; _x<=n; _x++) zält zwar richtig, aber danch erscheint Speciherzugriffsfehler. Wie kann ich den beseieigen oder die 1. for-Schleife so schreiben das es nicht zu viel ausgibt?
LG Kittxxx# include <stdio.h> # include <stdlib.h> # include <string.h> # include <malloc.h> int main(int argc, char* argv[]) { int **zm; //Matrix zum Aufloesen der Zwischenknoten int _x; int _y; int n = 6; //Intialliseren Matrizen und Vektoren zm = malloc(sizeof(int)*n); for(_x=0;_x<n;_x++) zm[_x]=malloc(sizeof(int)*n); for(_x=0;_x<n;_x++) for( _y=0;_y<n;_y++) if (_x==_y) zm[_x][_y] = 0; //Ausgabe der Zwischenmatrix printf("Matrix zum Aufloesen der Zwischenknoten\n"); char u; printf(" nach | "); for (_x=0;_x<n;_x++) { u=(char)(_x+1); (int)printf(" %d ", u); } printf("\n"); puts("----------------------------------"); int _s =0; printf(" von %d | ", _s+1); for (_x=0;_x<n;_x++) //for(_x=0;_x<=n;_x++) { for (_y=0;_y<n;_y++) { if (zm[_x][_y] > 0) { zm[_x][_y] = (zm[_x][_y] + 1); } else { zm[_x][_y]= 0; } printf(" %d ", zm[_x][_y]); } printf("\n",zm[_x][_y]); // if(_x != n) // printf(" hghgf "); // else printf(" %d | ", (_x+2)); } printf("\n"); /* //Ausgabe 1. for-schleife Matrix zum Aufloesen der Zwischenknoten nach | 1 2 3 4 5 6 ---------------------------------- von 1 | 0 0 0 0 0 0 2 | 0 0 0 0 0 0 3 | 0 0 0 0 0 0 4 | 0 0 0 0 0 0 5 | 0 0 0 0 0 0 6 | 0 0 0 0 0 0 7 | //Ausagbe 2. for-schleife Matrix zum Aufloesen der Zwischenknoten nach | 1 2 3 4 5 6 ---------------------------------- von 1 | 0 0 0 0 0 0 2 | 0 0 0 0 0 0 3 | 0 0 0 0 0 0 4 | 0 0 0 0 0 0 5 | 0 0 0 0 0 0 6 | 0 0 0 0 0 0 Segmentation fault (core dumped) */ return 0;
-
Die Zahl zuviel kommt daher, dass du _x+2 ausgibst (_x=5 ==> 7). Es waere besser _x+1 das am Anfang der Schleife auszugeben, z.B. so:
int _s =0; //Nicht mehr noetig //printf(" von %d | ", _s+1); for (_x=0;_x<n;_x++) //for(_x=0;_x<=n;_x++) { // Neu hier, mit _x+1 if (_x==0) printf(" von %d | ", _x+1); else printf(" %d | ", (_x+1)); for (_y=0;_y<n;_y++) { if (zm[_x][_y] > 0) { zm[_x][_y] = (zm[_x][_y] + 1); } else { zm[_x][_y]= 0; } printf(" %d ", zm[_x][_y]); } printf("\n",zm[_x][_y]); // if(_x != n) // printf(" hghgf "); // else // Das schreibt eins zu viel // printf(" %d | ", (_x+2)); }
-
lustig:
z.24 auch wenns jetzt kein fehler ist, da eh auf den zweiten parameter nicht zugegriffen wird, so wäre ein zugriff falsch, da er dann auf zm[0-5][6] erfolgen würdeKittxxx:
z.27 wieso initialisierst du nur die diagonale mit 0? mach doch das if raus, sonst ist der rest des arrays mit random werten gefüllt. falls nicht hast du eher glück gehabt bzw. setzen bestimmte malloc() versionen den speicher aus sicherheits gründen automatisch = 0, funktionieren also ähnlich wie calloc() doch das verhalten ist nicht so definiert...lg lolo
-
Zu erst mal Danke für die schnellen Antworten.
Ich habe es jetzt auch hinbekommen, mir ging es im Vordergrund nur um die richtig formatierte Ausgabe der Matrix.
Da ich gerade den Algorithmus von Floyed programmeire, wird dort die restliche Matrix mit Werten gefüllt.
-
Du musst n² bei malloc angeben, wenn du eine n×n-Matrix haben willst.
Zweidimensionale Matrix per malloc() kannst du aber sowieso vergessen.
für
a[X][Y];
entspricht
a[j]
folgendem:
*(a+X*i+j)
Der Compiler muss daher X kennen.
Und
zm = malloc(sizeof(int)*n); for(_x=0;_x<n;_x++) zm[_x]=malloc(sizeof(int)*n);
ist totaler Unfug. zm[_x] ist vom Typ int, malloc gibt etwas vom Typ void* zurück. Hörst du nicht, wie dein Compiler schreit vor Schmerz?
[i]Noch ein Nachtrag:*
Wenn, dann versuch es mal so in der Art:zm = malloc(sizeof(int *) * n); for (_x=0; _x < n; _x++) zm[_x] = malloc(sizeof(int) * n); for (_x=0; _x < n; _x++) for (_y=0; _y < n; _y++) if (_x == _y) (zm[_x])[_y] = 0;