1

我正在研究二进制矩阵。我的两个阵列正在重叠。(我检查了地址)。这只发生在少数大小的矩阵中。因此我得到错误的结果。我尝试使用 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

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

4

1 回答 1

6

C 编译器不允许重叠数组(除非你告诉他们或者他们真的有问题)。

大多数情况下,此类错误的原因是错误的指针算术或错误的数组访问。

即使您的代码只有 3 秒的时间,我也看到您的访问有问题:

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

于 2012-03-26T12:25:19.790 回答