我的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;
}
}
}
}
所以我的问题是:函数void verifica_mao_dupla(int ** mat,int ** mao_dupla),它应该只修改三角矩阵“mao_dupla”的元素,也是修改矩阵“mat”元素。这不应该发生。我不知道错误是什么。请帮忙
答案 0 :(得分:1)
有时,当您修改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
}
}
}
}