我正在研究二进制矩阵。我的两个数组正在重叠。 (我检查了地址)。这种情况只发生在少数几种矩阵上。因此我得到错误的结果。我尝试使用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
,我只在外循环中使用它。
答案 0 :(得分:5)
C-Compliers不要让重叠数组(除了你告诉他们或他们真的有错误)。
大多数情况下,这种错误的原因是错误的指针算法或错误的数组访问。
即使你的代码只用了3秒钟,我知道你的访问有问题:
你声明了Tab[m][..]
但是你有一个循环迭代i
从0到2 ^ m(顺便说一下用pow来计算它,不是很好,而是使用左移(&lt;&lt; ;))。然后您访问Tab[i][...]
,因此大多数时候您在未声明的索引处访问Tab。