内存地址重叠两个数组

cap*_*ain 1 c++ memory-management binary-matrix

我正在研究二元矩阵.我的两个数组正在重叠.(我检查了地址).这种情况只发生在少数几种矩阵上.因此我得到错误的结果.我尝试使用new来分配数组,但是当我这样做时会出现分段错误.有没有办法可以避免重叠记忆?我正在使用g ++编译器.

这就是我声明数组的方式

bool A[size0][size0],B[size0][size0],C[size0][size0];
Run Code Online (Sandbox Code Playgroud)

在下一步中,我将所有这些初始化.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
Run Code Online (Sandbox Code Playgroud)

根据我的观察TabC重叠.我通过打印来检查内存地址.它们在第二级的第六次迭代中重叠以进行循环(n = 9,m = 3,大小= 9,cnm = 3).我C之间没有使用过,我只在外循环中使用它.

flo*_*olo 5

C-Compliers不要让重叠数组(除了你告诉他们或他们真的有错误).

大多数情况下,这种错误的原因是错误的指针算术或错误的数组访问.

即使你的代码只用了3秒钟,我知道你的访问有问题:

你声明Tab[m][..]但是你有一个i从0到2 ^ m 迭代的循环(顺便说一下使用pow来计算它,不是很好,而是使用左移(<<)).然后你可以访问Tab[i][...],因此大多数时候你在未声明的索引上访问Tab.