程序编译无错误,但在运行时崩溃

时间:2018-02-13 19:09:03

标签: c debugging

我在编译期间没有收到任何错误,但是,当我执行它时,程序崩溃了。我推断错误是*mat3[x][y]=mat1[x][y]+mat2[x][y]的行。这里发生了什么,我该如何解决它?

typedef float matrice[255][255];

void Caricamento(matrice *, int , int , int );
void Molt(matrice *, int , int ); //Prototipi
void Somma(matrice , matrice , matrice *, int , int );
void Stampa(matrice , int , int );

int main()
{
    matrice A, B, C;
    int r, c;
    printf ("Inserisci la dimensione delle matrici A e B per il calcolo 2*A+B:\n");
    scanf ("%d", &r);
    scanf ("%d", &c);
    Caricamento(&A, r, c, 1);
    Caricamento(&A, r, c, 2);
    Molt(&A, r, c);
    Somma(A, B, &C, r, c);
    Stampa(C, r, c);
    return 0;
}

void Molt(matrice *mat1, int x, int y) //Procedura moltiplicazione
{
    int xi=0, yi=0; //Indici
    while(xi<x)
    {
        yi=0; //Reset indice
        while (yi<y)
        {
            *mat1[x][y]*=2; //Moltiplicazione
            yi++;
        }
        xi++;
    }
}

void Somma(matrice mat1, matrice mat2, matrice *mat3, int x, int y) //Procedura somma
{
    int xi=0, yi=0; //Indici
    while(xi<x)
    {
        yi=0; //Reset indice
        while (yi<y)
        {
            *mat3[x][y]=mat1[x][y]+mat2[x][y]; //Somma
            yi++;
        }
        xi++;
    }
}

2 个答案:

答案 0 :(得分:4)

这是operator precedence的问题。表达式*mat1[x][y]*=2被解析为*(mat1[x][y])*=2

改为使用(*mat1)[x][y]*=2

或者依赖于数组自然衰变到指向第一个元素的指针,并且无论如何都作为指针传递。例如,

void Molt(matrice mat1, int x, int y) //Procedura moltiplicazione
{
    ...
    mat1[x][y]*=2;
    ...
}

答案 1 :(得分:1)

将是

(*mat1)[x][y]*=2;

同样适用于mat3的其他功能。因为数组下标的优先级高于*取消引用。

此处matrice*的类型为float (*)[][],因此您需要先通过降级来获取二维数组。