2016-06-28 7 views
1
int** z= new int *[5]; 
for (int j = 0; j < 8; j ++) 
{ 
    z[j] = new int[5];   
} 

for (int n=0; n<8; ++n) 
{ 
    for(int m=0;m<5;++m) 
    { 
     int x=n%4; 
     int y=x*wB; 
     int p=(*(B+(y+m))); 

     z[n][m]=p;    
    }     
}  
return z;  

wirft wirft ein Bad_Acess_error bei n=6, aberZugreifen auf Speicherarray in C++ Fehler

int** z= new int *[5]; 
for (int j = 0; j < 8; j ++) 
{ 
    z[j] = new int[5];   
} 

for (int n=0; n<8; ++n) 
{ 
    for(int m=0;m<5;++m) 
    { 
     int x=n%4; 
     int y=x*5; 
     int p=(*(B+(y+m))); 

     z[6][m]=p;    
    }    
return z;    
} 

wirft kein Fehler auf. Warum? Das ist wirklich seltsam und ich kann nicht verstehen, warum das passiert. Ich gebe einfach mehr Text ein, damit ich diese Frage veröffentlichen kann.

Bearbeiten: ersetzt Variablen mit Zahlen. Die Zahlen sind nur Grenzen des fraglichen Arrays. Ich weiß, dass der zweite Code funktioniert, weil die Ausgabe genau das ist, was ich erwarte.

+1

Was ist Variable 'wB'? –

+1

Was ist der Wert von 'wb'? Es sieht auch so aus, als hättest du deine Bedingungen rückwärts. "wb" sollte die Grenze der äußeren for-Schleife und nicht der inneren Schleife sein. – NathanOliver

+1

Warum 'j <8' und' n <8'? Manchmal benutzt man 'wB' manchmal die magische Zahl' 8'. Sobald Sie jedoch auf ein Array außerhalb seines Definitionsbereichs zugreifen, kann die C++ - Laufzeit alles tun, was den C++ - Standard betrifft, einschließlich der Meldung oder Meldung eines Fehlers. Es ist sehr wahrscheinlich, dass Ihr zweites Programm nur gut aussieht, aber eigentlich nicht. – chi

Antwort

1

Einfach ausgedrückt: Pufferüberlauf.

int** z= new int *[5]; // Allocates space for 5 slots. 

for (int j = 0; 
    j < 8; // <---- *** Assumes space for 8 slots!!!!! 
    j ++) 
{ 
    z[j] = new int[5]; // At j==6, access is outside the array. 
} 
+0

Danke. Also für 2d Arrays ist es int ** z = neue int * [rowSize]; für (int j = 0; j <8; j ++) { z [j] = neuer int [Spaltengröße]; } –

+0

Wenn Sie ein 2D-Array, das 8 x 5 ist, möchten, müssen Sie die erste Zuweisung 8 statt 5 vornehmen. Sie haben eine 5 x 5 erstellt. –

Verwandte Themen