Segmentation fault em C

8 respostas Resolvido
c
Fabricio_Gaeta

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;

8 Respostas

Jelson1

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!

Fabricio_Gaeta

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

Jelson1

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

Fabricio_Gaeta

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

Jelson1

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.

Fabricio_Gaeta

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

Jelson1
Solucao aceita

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!

Fabricio_Gaeta

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

Muito obrigado!!!

Criado 22 de novembro de 2020
Ultima resposta 22 de nov. de 2020
Respostas 8
Participantes 2