Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Alocação estatica e dinamica de matriz 3 dimensoes

Fiz um tópico anterior a esse, mas estava bem confuso, ilegivel, pois parte do codigo estava misturado com um projeto meu (que alias, é onde eu pretendo utilizar essa tecnologia de matriz dinamica de 3 (ou ate mais) dimensões)

Estou com problemas na alocação dinamica de matriz de 3 dimensões

Enfim, segue abaixo alocação estática de matriz, nessa já fiz várias manipulações e não há problema nenhum, consigo acessar todos os locais da matriz

int main(){

    int matriz[2][3][2];
    int a=2, b=3 , c=2; //os valores de a,b,c devem coincidir com as dimensoes da matriz
    int i,j,k;
    int contador=1;

    for( i=0 ; i<a ; i++){
        for ( j=0; j<b ; j++){
            for ( k=0 ; k<c ; k++){
                matriz[i][j][k] = i+j+k;
                printf("%d matriz %d %d %d = %d \n", contador,i,j,k,matriz[i][j][k]);
                contador++;
            }
        }
    }
}

Meu problema é na alocação dinamica de matriz de 3 dimensoes, segue meu codigo , APARENTEMENTE, tudo roda bem, porem em algum ponto na liberação da memoria (coloquei alguns printf com numeros dentro) o programa simplesmente para de funcionar e encerra abruptamente

porem se tentar outras variantes para a,b,c , percebe-se que o programa simplesmente tem um comportamento estranho se a condição a<=b<=c não for respeitada

se ocorrer b>c , só vai rodar ate a interação [1][c][c] para qualquer "a" , e então o programa para abruptamente

se ocorrer a>b && b<c , so vai rodar ate a interação [b][b][c] , e entao o programa para abruptamente

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

int*** matriz;
int i,j,k;

int main(){
    //////////// inicio alocando matriz

    int a = 4;
    int b = 3;
    int c = 2; //dimensoes da matriz

    matriz = malloc (sizeof (int**) * a);

    for ( i = 0; i<b; i++){
        matriz[i] = malloc (sizeof (int*) * b);
    }

    for ( i = 0; i<b; i++){
        for (j = 0 ; j<c; j++){
            matriz[i][j] = malloc (sizeof (int) * c );
        }
    }
    ///////////// fim alocando matriz

    ////////////// inicio utilziar a matriz
    for( i=0 ; i<a ; i++){
        for ( j=0; j<b ; j++){
            for ( k=0 ; k<c ; k++){
                matriz[i][j][k] = i+j+k;
                printf("matriz %d %d %d = %d \n", i,j,k,matriz[i][j][k]);
            }
        }
    }
    printf("1\n");
    ///////////// fim utilizar a matriz


    ////////// inicio liberacao da matriz
    for ( i=0 ; i<a ; i++){
        for ( j=0; j<b ; j++){
            free ( matriz[i][j] );
        }
    }
    printf("2\n");
    for ( i=0 ; i<a ; i++ ){
        free ( matriz [i] );
    }
    printf("3\n");

    free ( matriz );

    printf("4\n");
    //////////// fim liberacao da matriz
}
2 respostas
solução!

Olá Igor,

aparentemente os problemas são na hora de fazer os mallocs do segundo e terceiro níveis que o último espaço de ambos não está sendo alocado na memória.

Você está tentando criar uma matriz 4 x 3 x 2. No primeiro malloc matriz = malloc (sizeof (int**) * a) você cria o primeiro nível da matriz com 4 espaços, ou seja, você agora tem a matriz[0], matriz[1], matriz[2] e matriz[3]. Mas note que no for que cria o segundo nível, você inicializa apenas a matriz[0], matriz[1] e matriz[2] porque você limita o for até o b e não até o a:

for ( i = 0; i<b; i++){ //aqui vai de 0 até 2 apenas, mas deveria ir de 0 a 3
     matriz[i] = malloc (sizeof (int*) * b);
}

Então se, por exemplo, você vai tentar acessar a posição matriz[3][0] ela não existe. O mesmo vale apara o segundo for:

for ( i = 0; i<b; i++){ // aqui deveria ir até a 3, mas vai até o 2
    for (j = 0 ; j<c; j++){ //aqui deveria ir até o 2, mas vai até o 1
            matriz[i][j] = malloc (sizeof (int) * c );
        }
}

Realmente, solucionou meu problema ! Fiz as alterações necessárias, e o código rodou como eu esperava, muito obrigado .

Entre o momento que postei a duvida e agora que fui respondido, eu bolei um sistema muito louco pra conseguir simular uma matriz com 3 dimensões:

A ideia foi alocar um segment linear grande e acessa-lo atraves do calculo da coordenada, da uma olhada no código (esse está funcionando perfeitamente)

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

int main(){

    struct matriz_3D {
        int* matriz;
        int a,b,c;
        int posicao;
    };

    struct matriz_3D q;

    int i,j,k;

    q.a = 4;
    q.b = 3;
    q.c = 2; //dimensoes da matriz

    q.matriz = malloc (sizeof (int) * q.a*q.b*q.c);

    for( i=0 ; i<q.a ; i++){
        for ( j=0; j<q.b ; j++){
            for ( k=0 ; k<q.c ; k++){
                q.posicao = i*(q.b*q.c) + j*(q.c) + k;
                q.matriz[q.posicao] = i+j+k;
                printf("%d matriz %d %d %d = %d \n", q.posicao,i,j,k,q.matriz[q.posicao]);
            }
        }
    }

    free ( q.matriz );
}

o q.posicao guarda o a posicao referente as coordenadas q.a , q.b , q.c ; simulando uma matriz de 3 dimensões

Porem simpatizo mais com a declaração anterior (conforme codigo abaixo), pois não precisa ficar fazendo calculo com q.posicao.

int*** matriz;

Enfim, muito obrigado