Ir ao conteúdo
  • Cadastre-se

Erro ao executar programa com alocação dinâmica para matriz


Yago Sousa
Ir à solução Resolvido por Ansi C,

Posts recomendados

Esta havendo um erro quando executo o meu código, mais precisamente no momento em que coloco o primeiro elemento na matriz.

 

O código foi copilado no visual estudo 2013.

 

 

Código:

 
//Contruir duas matrizes de tamanhos iquais e quadradas e multiplicar-las.#include <stdio.h>#include <stdlib.h>int **_matriz1, **_matriz2, **_resultado;void recebe_tamanho_das_matrizes();void aloca_memoria(int tamanho1linha, int tamanho1coluna, int tamanho2linha, int tamanho2coluna);void recebe_valores(int tamanho1linha, int tamanho1coluna, int tamanho2linha, int tamanho2coluna);void multiplica_matrizes_e_mostra(int tamanho1linha, int tamanho1coluna, int tamanho2linha, int tamanho2coluna);void libera_memoria(int tamanho1linha, int tamanho1coluna, int tamanho2linha, int tamanho2coluna);int main(void){recebe_tamanho_das_matrizes();system("pause");return 0;}void recebe_tamanho_das_matrizes(){int tamanho1linha,tamanho1coluna, tamanho2linha,tamanho2coluna;//recebe valores de matriz 1do{printf("Digite o numero de linhas da matriz 1: ");scanf_s("%d", &tamanho1linha);if (tamanho1linha <= 0){printf("ERRO!. Digite valores positivos e maiores que zero.\n");}}while (tamanho1linha <= 0);//recebe valores para coluna de 1 coluna de 2, eles devem ser iquais para ocorrer a multiplicaçãodo{printf("Digite o numero colunas de 1 e linhas de 2: ");scanf_s("%d", &tamanho1coluna);if (tamanho1coluna <= 0){printf("ERRO!. Digite valores positivos e maiores que zero.\n");}tamanho2linha = tamanho1coluna;} while (tamanho1coluna <= 0);//recebe valores de matriz 2do{printf("Digite o numero de colunas da matriz 2: ");scanf_s("%d", &tamanho2coluna);if (tamanho2coluna <= 0){printf("ERRO!. Digite valores positivos e maiores que zero.\n");}}while (tamanho2coluna <= 0);aloca_memoria(tamanho1linha, tamanho1coluna, tamanho2linha, tamanho2coluna);}void aloca_memoria(int tamanho1linha, int tamanho1coluna, int tamanho2linha, int tamanho2coluna){int i=0;_matriz1 = (int**)malloc(tamanho1linha * sizeof(int *)); //aloca a matriz 1for (i = 0; i < tamanho1linha; i++);_matriz1[i] = (int*)malloc(tamanho1coluna*sizeof(int));_matriz2 = (int**)malloc(tamanho2linha * sizeof(int *)); //aloca a matriz 2for (i = 0; i < tamanho2linha; i++);_matriz2[i] = (int*)malloc(tamanho2coluna*sizeof(int));_resultado = (int**)malloc(tamanho1linha * sizeof(int *)); //aloca o resutladofor (i = 0; i < tamanho1linha; i++);_resultado[i] = (int*)malloc(tamanho2coluna*sizeof(int));recebe_valores(tamanho1linha, tamanho1coluna, tamanho2linha, tamanho2coluna);}void recebe_valores(int tamanho1linha, int tamanho1coluna, int tamanho2linha, int tamanho2coluna){int i, j;for (i = 0; i < tamanho1linha; i++)for (j = 0; j < tamanho1coluna; j++){printf("Digite o elemento [%d][%d] da primeira matriz: ", i, j);scanf_s("%d", &_matriz1[i][j]);}printf("\n\n");for (i = 0; i<tamanho2linha; i++)for (j = 0; j<tamanho2coluna; j++){printf("\nElemento[%d][%d] = ", i, j);scanf_s("%d", &_matriz2[i][j]);}multiplica_matrizes_e_mostra(tamanho1linha, tamanho1coluna, tamanho2linha, tamanho2coluna);}void multiplica_matrizes_e_mostra(int tamanho1linha, int tamanho1coluna, int tamanho2linha, int tamanho2coluna){int i=0, j=0,c=0,temp=0;for (i = 0; i < tamanho1linha; i++){for (j = 0; j < tamanho2coluna ; j++){for (c = 0; c < tamanho1coluna ; c++){temp += _matriz1[i][c] * _matriz2[c][j];_resultado[i][j] = temp;}printf("Matriz[%d][%d]: %d\n", i, j, _resultado[i][j]);temp = 0;}}}void libera_memoria(int tamanho1linha, int tamanho1coluna, int tamanho2linha, int tamanho2coluna){int i;for (i = 0; i < tamanho1linha; i++) {free(_matriz1[i]);}free(_matriz1);for (i = 0; i < tamanho2linha; i++) {free(_matriz2[i]);}free(_matriz2);for (i = 0; i < tamanho1coluna; i++) {free(_resultado[i]);}free(_resultado);}
Link para o comentário
Compartilhar em outros sites

  • Solução

Esta ocorrendo acesso violado de memoria, acho que por conta das instancias for().

que estranhamento termina com esta.

_matriz2 = (int**)malloc(tamanho2linha * sizeof(int *)); //aloca a matriz 2for (i = 0; i < tamanho2linha; i++);_matriz2[i] = (int*)malloc(tamanho2coluna*sizeof(int));

Se colocarmos ; (ponto-e-virgula) no final de um declaração loop sem bloco, ele inutiliza o loop, que passa a não fazer nada

 for (i = 0; i < tamanho2linha; i++); <-- não faz nada

Link para o comentário
Compartilhar em outros sites

Esta ocorrendo acesso violado de memoria, acho que por conta das instancias for().

que estranhamento termina com esta.

_matriz2 = (int**)malloc(tamanho2linha * sizeof(int *)); //aloca a matriz 2for (i = 0; i < tamanho2linha; i++);_matriz2[i] = (int*)malloc(tamanho2coluna*sizeof(int));

Se colocarmos ; (ponto-e-virgula) no final de um declaração loop sem bloco, ele inutiliza o loop, que passa a não fazer nada

 for (i = 0; i < tamanho2linha; i++); <-- não faz nada

 

Eu corrigi o código como você falou eu não acredito que eu errei em algo tão superficial.

deixa eu ver se eu entendi:

quer dizer que o malloc fez a locação para as linhas {a ; a ; a ; a}

mas como o loop n foi feito a alocação para as colunas não aconteceu então quando a variável contadora i passou de 1 ele da erro de memoria porque não foi alocada memoria para ele. seria isso?

então o erro não estava onde o copilador mostrou mas sim na alocação, serio eu refiz o código varias vezes e não me toquei para isso.

valeu cara valeu mesmo.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...