2016-03-31 16 views
0

Ich bin neu im Programmieren und ich versuche das zweidimensionale Array zu verstehen. Ich habe diesen Code geschrieben, um meinen Code zu testen, ob er funktioniert oder nicht. Leider bekomme ich einen Segmentierungsfehler. Ich weiß, das bedeutet, dass etwas, das ich geschrieben habe, für den Compiler nicht lesbar ist, aber ich weiß nicht, was es ist. weil mir alles gut scheint.Segmentierungsfehler zweidimensionales Array

#include<iostream> 


using namespace std; 


int main(){ 

    int col, row,i; 
    int **array; 

    cout << "How many rows?\n"; 
    cin >> row; 
    cout << "How many colomns\n"; 
    cin >> col; 

cout << "!!!!!!!!!!!!"; 

    array = new int*[row]; 
    for (int i = 0;i<row;i++){ 
      array[i] = new int[col]; 
    } 

     cout << "!!!!!!!!!!!!"; 

    for(i=0; i<row; i++){ 
     int x=1; 
     array[0][i]= x;; 
    x++; 
    } 
     cout << "!!!!!!!!!!!!"; 
    cout << array[row][col]; 

    for(i=0; i<row; i++){ 

    delete [] array[i]; 
    delete [] array; 
    } 
    return 0; 
} 

Der Fehler ist: " Wie viele Zeilen Wie viele colomns Segmentation fault (core dumped) ?"

+0

'cout << array [Zeile] [Spalte];' ist außer Reichweite. 'array [row-1] [col-1]' ist so tief wie möglich. – WhozCraig

+0

x ++; macht nichts; x endet am Ende jeder Schleifeniteration und wird zu Beginn der nächsten Iteration neu erstellt. – mjwach

+0

Wir verwenden keine Zeiger und Arrays und neu und deete in C++ viel in diesen Tagen. Es gibt gesündere Alternativen wie std :: vector und std :: shared_ptr. –

Antwort

1

array[0][i]= x; falsch aussieht. Es sollte sein:

array[i][0]= x; 

Erster Index ist für Reihe und Sekunde für Spalte.

Später cout << array[row][col]; ist auch wring als row ist außerhalb des Bereichs.

for(i=row - 1; i >= 0; --i){ 
    delete [] array[i]; 
} 
delete [] array; 
+0

also sollte es so sein? – pnewbie

0
cout << array[row][col]; 

in jeder der beiden Dimensionen Außerhalb des Bereichs, wie andere gesagt haben:

Die Art und Weise Sie das Array löschen auch falsch ist, sollte es sein.

for(i=0; i<row; i++){ 

delete [] array[i]; 
delete [] array; 
} 

Sie löschen Elemente des Arrays dreimal, einmal für jedes Element. Das ist gut. Sie löschen das Array selbst auch dreimal. Das ist gefährlich und falsch.

0

so sollte es so sein?

#include<iostream> 


using namespace std; 


int main(){ 

    int col, row,i; 
    int **array; 

    cout << "How many rows?\n"; 
    cin >> row; 
    cout << "How many colomns\n"; 
    cin >> col; 

    array = new int*[row]; 
    for (int i = 0;i<row;i++){ 
      array[i] = new int[col]; 
    } 

     cout << "!!!!!!!!!!!!"; 

    for(i=0; i<row; i++){ 
     int x=1; 
     array[i][0]= x;; 
    x++; 
    } 
     cout << "!!!!!!!!!!!!"; 
    for(i=0; i<row; i++){ 
     for(int j=0; j<col; j++){ 
      array[i][j]; 
     } 
    } 
    cout << array[row][col];  

    for(i=0; i<row; i++){ 

    delete [] array[i]; 
    delete [] array; 
    } 
    return 0; 
} 
+0

x ++; und Array [i] [j]; tue nichts, aber sie werden auch nichts schaden. lösche [] Array; läuft immer noch dreimal falsch (vorausgesetzt, Zeile ist 3). Ansonsten sehe ich keine Probleme, obwohl ich das nicht durch Ausführen des Codes bestätigt habe. – mjwach

0

Diese Linie liegt außerhalb des Bereichs cout << array[row][col]; .Wenn Sie das letzte Element drucken wollen, dann diese Zeile zu ändern, um cout << array[row-1][col-1];

Wie andere, die unten erwähnt werden für den zugewiesenen Speicher zu löschen

for(i=0; i <row; i++){ 
    delete [] array[i];  
} 
delete [] array; 

Auch in Ihrem Code unter x wird immer 1, x++ ist nicht wirksam.

for(i=0; i<row; i++){ 
int x=1;  
array[0][i]= x; 
x++; 
} 

wenn Sie wollen x für jede Zeile zu erhöhen, dann x außerhalb der Schleife initialisieren wie diese

int x=1; 
for(i=0; i<row; i++){  
    array[0][i]= x;; 
    x++; 
} 
Verwandte Themen