Passing pointer pointer by reference

Asked

Viewed 663 times

0

I’m making a program where I need to dynamically allocate two matrices, so I thought I’d make this allocation into a function. I tried to do it this way, but it’s giving "Segmentation Failure". Could someone help me?

void CriaMatriz(int ***matriz, int linhas, int colunas){

    int i,j;

    /* Alocação das linhas da matriz. */
    matriz = (int ***) malloc(linhas * sizeof(int **));

    /* Alocação das colunas da matriz. */
    for (i = 0; i < linhas; i++) {

        matriz[i] = (int **) malloc(colunas * sizeof(int*));

        /* Preenchimento da matriz. */
        for (j = 0; j < colunas; j++) {
            scanf("%d", matriz[i][j]);
        }
    }
}

int main() {

    int **matriz1, linhas, colunas;

    CriaMatriz(&matriz1, linhas, colunas);

}
  • 2

    There are some conceptual errors in your code. The first is that you’ve allocated up to the maximum integer pointer level, which means that you could manipulate integer pointers, but not the integer itself. The other error I saw is that you are allocating a pointer pointer pointer, and assigning the result of that allocation to matriz, when you would like the function you called CriaMatriz had the first parameter with the allocation value, then you should allocate pointer and save the result of the malloc in (*matriz)

1 answer

0


There are some errors in the code regarding the understanding of what is happening. A two-dimensional matrix can be represented as a pointer to pointer, in your case, as quoted in the comments, you were trying to make a kind of three-dimensional array. The image below is a representation of how it looks in memory.

Arrays como ponteiros

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

int** CriaMatriz(int linhas, int colunas);

int main(int argc, char* argv){
    int **matriz1, i, linhas = 2, colunas = 2;

    matriz1 = CriaMatriz(linhas, colunas);

    // Após uso deve-se liberar a memória
    for (i = 0; i < linhas; i++){
        // Liberando as linhas
        free(matriz1[i]);
    }

    // Liberando o apontador principal
    free(matriz1);
}

int** CriaMatriz(int linhas, int colunas){
    // Você estava manipulando uma variável local
    int i,j, **matriz;

    // Agora temos a alocação correta, teremos X ponteiros para ponteiros
    matriz = (int**) malloc(linhas * sizeof(int*));

    // Cada ponteiro terá X colunas de inteiros
    for (i = 0; i < linhas; i++) {
        matriz[i] = (int*) malloc(colunas * sizeof(int));
    }

    /* Preenchimento da matriz. */
    for (i = 0; i < linhas; i++) {
        for (j = 0; j < colunas; j++) {
            // Nós colocamos o valor no endereço apontado
            scanf("%d", &matriz[i][j]);
        }
    }
    // retornando o endereço principal
    return matriz;
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.