Segmentation fault em C

fala rapaziada, estou tentando criar um programa que recebe duas matrizes e calcula a multiplicação entre as duas, porém estou recebendo um erro de segmentation fault e não consigo mto bem entender o por que, alguém consegue me dar alguma luz?

#include <stdio.h>
#include <stdlib.h>

int main()
{
int temp, m, n, p, q, c, d, k, sum = 0;

scanf("%d%d", &m, &n);

int **first = malloc(sizeof(int) * m);

for(int i = 0; i < m; i++)
{
first[i] = malloc(sizeof(int) * n);

}

for ( c = 0 ; c < m ; c++ )
{
for ( d = 0 ; d < n ; d++ )
{
scanf("%d", &first[c][d]);
}
}

scanf("%d%d", &p, &q);

int **second = malloc(sizeof(int) * p);

for(int i = 0; i < p; i++)
{
second[i] = malloc(sizeof(int) * q);

}

for ( c = 0 ; c < p ; c++ )
{
  for ( d = 0 ; d < q ; d++ )
  {
    scanf("%d", &second[c][d]);
  }
}

int **multiply = malloc(sizeof(int) * m);

for(int i = 0; i < m; i++)
{
multiply[i] = malloc(sizeof(int) * q);
}

for ( c = 0 ; c < m ; c++ )
{
  for ( d = 0 ; d < q ; d++ )
  {
    for ( k = 0 ; k < p ; k++ )
    {
      sum = sum + first[c][k]*second[k][d];
    }

    multiply[c][d] = sum;
    sum = 0;
  }
}



for ( c = 0 ; c < m ; c++ )
{
  for ( d = 0 ; d < q ; d++ )
    printf("%d ", multiply[c][d]);

  printf("\n");
}

for(int i = 0; i < m; i++)
{
    free(first[i]);
}

free(first);

for(int i = 0; i < p; i++)
{
    free(second[i]);
}

free(second);

for(int i = 0; i < m; i++)
{
    free(multiply[i]);   
}

free(multiply);

return 0;

Tem esse post no Stack Overflow que fala sobre o problema:


Testei o seu código com duas matrizes 2x2 e funcionou, talvez você esteja inicializando as matrizes com tamanhos muito grande!

essa é a questão, isso é um trabalho de faculdade e os primeiros testes são com matrizes pequenas, até funciona, mas quando vem os testes com matrizes muito grandes não funciona mais

Qual o tamanho máximo que uma matriz pode ter?

o maior teste que eu vi no sistema são com matrizes 10x10

Humm, então deve ser realmente problema no código!
Você pode postar os casos de teste para onde o seu código falha?

Outra coisa, você poderia usar vector ? É uma estrutura disponível no c++ que tem gerenciamento de memória automático, facilitando o trabalho com vetores.

infelizmente não posso, tem que ser feito em C, não em C++.

um dos testes que já acontece o erro é com este aqui
7 3
27 58 36
36 98 50
98 78 98
18 27 26
41 33 80
85 4 28
41 53 34
3 10
5 78 5 24 44 18 93 58 82 74
76 53 38 89 73 15 86 57 4 8
76 67 28 100 79 87 39 51 61 91

O problema estava na inicialização das matrizes! Com base nesse post, eu fiz algumas modificações:


O código ficou asssim:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int temp, m, n, p, q, c, d, k, sum = 0;

    scanf("%d%d", &m, &n);

    int **first = malloc(sizeof(int *) * m); // Aqui

    for(int i = 0; i < m; i++) {
        first[i] = malloc(sizeof(int *) * n); // Aqui
    }

    for ( c = 0 ; c < m ; c++ ) {
        for ( d = 0 ; d < n ; d++ ) {
             scanf("%d", &first[c][d]);
        }
    }

    scanf("%d%d", &p, &q);

    int **second = malloc(sizeof(int *) * p); // Aqui

    for(int i = 0; i < p; i++) {
        second[i] = malloc(sizeof(int *) * q); // Aqui
    }

    for ( c = 0 ; c < p ; c++ ) {
        for ( d = 0 ; d < q ; d++ ) {
           scanf("%d", &second[c][d]);
        }
    }
    
    int **multiply = malloc(sizeof(int *) * m); // Aqui

    for(int i = 0; i < m; i++) {
        multiply[i] = malloc(sizeof(int *) * q); // Aqui
    }

    for ( c = 0 ; c < m ; c++ ) {
        for ( d = 0 ; d < q ; d++ ) {
            for ( k = 0 ; k < p ; k++ ) {
                sum = sum + first[c][k]*second[k][d];
            }

            multiply[c][d] = sum;
            sum = 0;
        }
    }



    for ( c = 0 ; c < m ; c++ ) {
        for ( d = 0 ; d < q ; d++ )
            printf("%d ", multiply[c][d]);

        printf("\n");
    }

    for(int i = 0; i < m; i++) {
        free(first[i]);
    }

    free(first);

    for(int i = 0; i < p; i++) {
        free(second[i]);
    }

    free(second);

    for(int i = 0; i < m; i++) {
        free(multiply[i]);   
    }

    free(multiply);
    return 0;
}

No caso de teste acima funcionou!

pqp cara você é um anjo, funcionou!!!

Muito obrigado!!!

1 curtida