两个数组的内存地址重叠
Memory address overlap of two arrays
我正在研究二进制矩阵。我的两个数组重叠了。(我检查了地址)。这种情况只发生在少数大小的矩阵上。因此我得到了错误的结果。我试着用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
根据我的观察,CCD_ 1和CCD_。我通过打印来检查内存地址。它们在循环的第二级的第六次迭代时重叠。(n=9,m=3,尺寸=9,cnm=3)。我没有在中间使用C
,我只在外循环中使用它。
C编译器不允许数组重叠(除非你告诉他们,否则它们真的有缺陷)。
大多数情况下,此类错误的原因是错误的指针算术或错误的数组访问。
即使在你的代码只有3秒长的时候,我看到,你的访问出现了问题:
您声明了Tab[m][..]
,但得到了一个从0到2^m在i
上迭代的循环(顺便说一句,使用pow来计算它不是很好,而是使用左移(<<))。然后访问Tab[i][...]
,所以大多数时候都是在未声明的索引处访问Tab。
相关文章:
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使用内存地址访问结构的属性值
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 将布局映射到内存地址
- 为什么同一个变量的内存地址不同?
- 无法将内存地址转换为值
- 给定特定内存地址的数组的动态内存分配
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 获取 R 数据帧的内存地址
- c++ 编译器是否保护常量内存地址免受任何更改?
- 如何防止矢量的内存地址更改
- cout 打印内存地址而不是值
- 如何运行外部程序,向其传递内存地址以读取/写入?
- 循环中的变量被设置为下一个数组的元素始终具有相同的内存地址?
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- C++在变量的内存地址上做什么来"deallocate"它?
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 为什么我无法获取 MSVS2019 / C++ 中字符或uint8_t变量的内存地址?