Адрес памяти перекрывается двумя массивами
Я работаю над двоичными матрицами. Два из моих массивов перекрываются. (Я проверил адреса). Это происходит только для нескольких размеров матриц. Следовательно, я получаю неправильные результаты. Я пытался использовать new для выделения массивов, но при этом я получаю ошибку сегментации. Есть ли способ избежать дублирования памяти? Я использую компилятор g++.
Вот как я объявил массивы
bool A[size0][size0],B[size0][size0],C[size0][size0];
На следующем шаге я инициализирую их все. A и B - операнды, а C будет содержать результат.
Я использую собственный алгоритм умножения на следующем этапе. Вот фрагмент
for(I=0;I<cnm;I++){
bool Tab[m][size];
bool Ctemp[size][size];
int count=0;
for(uint i=0;i<pow(2.0,m*1.0);i++){
for(uint j=0;j<n;j++){
Tab[i][j]=0; //Initialize
if(i==0){
Tab[i][j] = 0;
}
else{
int dec;
//h is calculated here
dec=gray_map[i-1]^gray_map[i]; //gray_map returns gray code
Tab[i][j] = Tab[i-1][j] ^ B[h][j];
}
....
....
}
}
.....
.....
//Rest of the code
По моим наблюдениям Tab
а также C
перекрываются Я проверил адреса памяти, напечатав их. Они перекрываются на шестой итерации второго уровня для цикла (n=9, m=3, размер =9, cnm=3). Я НЕ использовал C
между ними я использую его только во внешнем цикле.
1 ответ
C-Compliers не позволяют перекрывать массивы (за исключением того, что вы говорите им, или они действительно глючат).
В большинстве случаев причиной таких ошибок является неправильная арифметика указателя или неправильный доступ к массиву.
Даже если у вас всего 3 секунды на код, я вижу, что с вашим доступом что-то не так:
ты объявил Tab[m][..]
но у вас есть цикл, повторяющийся i
от 0 до 2^m (кстати, используя pow для его вычисления, это не очень хорошо, вместо этого используйте сдвиг влево (<<)). И тогда вы получаете доступ Tab[i][...]
, так что в большинстве случаев вы получаете доступ к Tab по необъявленным индексам.