C中的奇怪矩阵行为

时间:2016-11-30 19:34:02

标签: c matrix allocation

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

1 个答案:

答案 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
            }
        }
    }
}
相关问题