2016-06-28 2 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;  

Bad_Acess_error бросает на n=6, ноДоступ к памяти массива в C++ бросает ошибку

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;    
} 

не проливает ошибку. Зачем? Это действительно странно, и я не могу понять, почему это происходит. Я просто набираю текст, поэтому я могу опубликовать этот вопрос.

Редактировать: заменить переменные номерами. Числа - это только пределы рассматриваемого массива. Я знаю, что второй код работает, потому что результат - именно то, что я ожидаю.

+1

Что такое переменная 'wB'? –

+1

Какова ценность 'wb'? Это также похоже на то, что у вас есть свои условия назад. 'wb' shoul - предел внешнего цикла, а не внутренний цикл. – NathanOliver

+1

Почему 'j <8' и' n <8'? Иногда вы иногда используете 'wB' волшебное число' 8'. В любом случае, как только вы получите доступ к массиву вне его диапазона определения, среда выполнения C++ может делать что угодно, насколько это предусмотрено стандартом C++, включая как отчетность, так и сообщение об ошибке. Очень вероятно, что ваша вторая программа просто выглядит нормально, но на самом деле это не так. – chi

ответ

1

Проще говоря: переполнение буфера.

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

Спасибо. Итак, для 2d массивов это int ** z = new int * [rowSize]; для (int j = 0; j <8; j ++) { z [j] = новый int [Column Size]; } –

+0

Если вам нужен 2-й массив размером 8 x 5, вам нужно сделать первое выделение 8 вместо 5. Вы создали 5x5. –

Смежные вопросы