提问者:小点点

C中的奇怪矩阵行为


我的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”元素。这是不应该发生的。我不知道是什么错误。请帮助


共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
            }
        }
    }
}