我的C程序使用2 int矩阵。第一个矩阵是n x n并以这种方式分配:
void alocar_matriz(int ***matriz)
{
int i;
if((*matriz = (int**)calloc(n,sizeof(int*)))==NULL)
{
printf("\n\a\t\tERRO: NAO FOI POSSIVEL ALOCAR MEMORIA!!\n");
exit(1);
}
for(i=0;i<n;i++)
{
if(((*matriz)[i] = (int*)calloc(n,sizeof(int)))==NULL)
{
printf("\n\a\t\tERRO: NAO FOI POSSIVEL ALOCAR MEMORIA!!\n");
exit(1);
}
}
}
第二个是三角形劣矩阵,这样分配:
void alocar_matriz_mao_dupla(int ***matriz)
{
int i;
if((*matriz = (int**)calloc(n,sizeof(int*)))==NULL)
{
printf("\n\a\t\tERRO: NAO FOI POSSIVEL ALOCAR MEMORIA!!\n");
exit(1);
}
for(i=0;i<n;i++)
{
if(((*matriz)[i] = (int*)calloc(i+1,sizeof(int)))==NULL)
{
printf("\n\a\t\tERRO: NAO FOI POSSIVEL ALOCAR MEMORIA!!\n");
exit(1);
}
}
}
有了第一个矩阵数据,我有一个修改第二个(三角形)矩阵值的函数(其中mat是第一个nxn矩阵,mao_dupla是第二个三角形矩阵):
void verifica_mao_dupla(int **mat, int **mao_dupla)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i!=j)
{
if(mat[i][j]==1 && mat[j][i]==1)
mao_dupla[j][i] = 1;
}
}
}
}
所以我的问题是:函数voidverifica_mao_dupla(int**mat, int**mao_dupla),它应该只修改三角形矩阵“mao_dupla”的元素,也在修改矩阵“mat”元素。这是不应该发生的。我不知道是什么错误。请帮助
有时当你修改mao_dupla[j][i]
时,j
小于i
。在这种情况下,写入超出了mao_dupla[j]
的界限,产生了未定义的行为。此外,您执行的工作比您需要做的要多。
您应该能够通过改进数组索引的处理和更改循环限制来解决问题:
void verifica_mao_dupla(int **mat, int **mao_dupla) {
for(int i = 1; i < n; i++) { // no need for an i == 0 iteration
for(int j = 0; j < i; j++) { // fixed loop bounds
// note: j cannot be equal to i here
if(mat[i][j]==1 && mat[j][i]==1) {
mao_dupla[i][j] = 1; // swapped index order
}
}
}
}