Адрес памяти перекрывается двумя массивами

Я работаю над двоичными матрицами. Два из моих массивов перекрываются. (Я проверил адреса). Это происходит только для нескольких размеров матриц. Следовательно, я получаю неправильные результаты. Я пытался использовать 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 по необъявленным индексам.

Другие вопросы по тегам