Matrici.. Come vengono allocate in memoria? (Stack e libera)

di il
7 risposte

Matrici.. Come vengono allocate in memoria? (Stack e libera)

Salve a tutti, vi spiego il mio problema: (linguaggio: C + + )
se passo ad una funzione una matrice e due interi, r (righe) e c (colonne), e come argomento formale uso un puntatore a puntatori a interi, int** mat, posso lavorare sulla matrice con i doppi indici (sempre se passo in modo corretto l'argomento attuale, ovvero l'indirizzo di memoria del puntatore a interi, cioè mat[0])...
Ho provato, nel main, a dichiarare e definire una matrice, creandola nello stack, così:
NEL MAIN:
int mat[3][3]={ {1,2,3} , {4,5,6} , {7,8,9} };
Se chiamo la funzione con questa matrice il compilatore mi da errore di conversione da int* a int**... non capisco il perchè...
Invece se creo una matrice, sempre nel main, in memoria dinamica e poi chiamo la funzione passando l'indirizzo di memoria dell'array di puntatori Allora la funzione Funziona correttamente senza che il compilatore mi dia errore...
Adesso la mia domanda è questa... Come vengono allocate in memoria le matrici?
io sapevo che veniva allocata come un array di dimensione righe per colonne e poi ci si può lavorare con l'aritmetica dei puntatori... mat[i*colonne+j] (dove i e j sono gli argomenti di due cicli for annidati)...
Grazie in anticipo a tutti

7 Risposte

  • Re: Matrici.. Come vengono allocate in memoria? (Stack e libera)

    Stack
    int mat[3][3]={ {1,2,3} , {4,5,6} , {7,8,9} };
    Heap
    int **mat;
    Mentre nel primo caso il compilatore sa esatamente il numero di colonne (cioè 3) se tu li passi un doppio puntatore lui non la accetta perche vuole una dimensione fissa.
    Nel secondo caso non urla perche sei tu a sapere cosa li stai passando, lui vede solo la forma semantica (che in questo caso per lui è a posto)
  • Re: Matrici.. Come vengono allocate in memoria? (Stack e libera)

    skynet ha scritto:


    Stack
    int mat[3][3]={ {1,2,3} , {4,5,6} , {7,8,9} };
    Heap
    int **mat;
    Mentre nel primo caso il compilatore sa esatamente il numero di colonne (cioè 3) se tu li passi un doppio puntatore lui non la accetta perche vuole una dimensione fissa.
    Nel secondo caso non urla perche sei tu a sapere cosa li stai passando, lui vede solo la forma semantica (che in questo caso per lui è a posto)
    Ma in memoria vengono allocate allo stesso modo?
    ad esempio nel caso di una matrice di int, vengono creati oggetti int sequenziali (organizzati per righe) ? (quindi viste come un array di dimensione righe per colonne?)
  • Re: Matrici.. Come vengono allocate in memoria? (Stack e libera)

    lorenzosax ha scritto:


    Ma in memoria vengono allocate allo stesso modo?
    Ovviamente no.

    Se scrivi

    mat[3][3]

    allora avrai in memoria, sequenzialmente, a partire dall'indirizzo individuato da mat (mat è un puntatore), i valori

    1 2 3 4 5 6 7 8 9

    (naturalmente se parliamo di interi a 32 bit, ognuno occuperà 4 byte).

    Nell'altro caso

    int **mat;

    in memoria avrai un vettore che inizia dall'indirizzo individuato da mat, contenente 3 puntatori a intero memorizzati in sequenza, che esemplifico così

    <punt1><punt2><punt3>

    A partire dall'indirizzo individuato dal puntatore <punt1> avrai, in sequenza, gli interi

    1 2 3

    A partire da <punt2> avrai

    4 5 6

    A partire da <punt3> avrai

    7 8 9

    Nota che i tre puntatori possono puntare ovunque in memoria e non c'è nessuna relazione tra loro (almeno, non prevedibile).

    Ci pensa il compilatore a fare i calcoli per generare indici e istruzioni macchina corrette per puntare agli elementi corretti se tu accedi nella forma [][]
  • Re: Matrici.. Come vengono allocate in memoria? (Stack e libera)

    oregon ha scritto:


    lorenzosax ha scritto:


    Ma in memoria vengono allocate allo stesso modo?
    Ovviamente no.

    Se scrivi

    mat[3][3]

    allora avrai in memoria, sequenzialmente, a partire dall'indirizzo individuato da mat (mat è un puntatore), i valori

    1 2 3 4 5 6 7 8 9

    (naturalmente se parliamo di interi a 32 bit, ognuno occuperà 4 byte).

    Nell'altro caso

    int **mat;

    in memoria avrai un vettore che inizia dall'indirizzo individuato da mat, contenente 3 puntatori a intero memorizzati in sequenza, che esemplifico così

    <punt1><punt2><punt3>

    A partire dall'indirizzo individuato dal puntatore <punt1> avrai, in sequenza, gli interi

    1 2 3

    A partire da <punt2> avrai

    4 5 6

    A partire da <punt3> avrai

    7 8 9

    Nota che i tre puntatori possono puntare ovunque in memoria e non c'è nessuna relazione tra loro (almeno, non prevedibile).

    Ci pensa il compilatore a fare i calcoli per generare indici e istruzioni macchina corrette per puntare agli elementi corretti se tu accedi nella forma [][]
    Grazie Oregon
    un ultima cosa guarda questo codice:
    #include <iostream>
    using namespace std;
    
    int somma_mat1(int** mat, int r, int c){
    	int som=0;
    	for (int i=0; i<r; i++){
    		for (int j=0; j<c; j++){
    			som = som + mat[i][j];	
    		}	
    	}
    	return som;
    }
    
    
    
    int main(){
        int mat1[3][3]={ {1,2,3}, {4,5,6}, {7,8,9}};
    	cout <<"Funzione 1: "<<somma_mat1(mat1[0],3,3)<<endl<<endl;
    	return 0;
    }
    quindi se ho una matrice allocata nello stack non posso passarla ad una funzione che ha come argomento formale un int** mat ?
    come posso risolvere?
  • Re: Matrici.. Come vengono allocate in memoria? (Stack e libera)

    lorenzosax ha scritto:


    come posso risolvere?
    In quel modo non puoi, ma se scrivi
    
    	int v[3][3]={ {1,2,3}, {4,5,6}, {7,8,9}};
    	int *p[3] = { v[0], v[1], v[2] };
    
    	cout <<"Funzione 1: "<<somma_mat1(p, 3, 3)<<endl<<endl;
    
    allora va bene ...
  • Re: Matrici.. Come vengono allocate in memoria? (Stack e libera)

    Ok grazie di tutto
  • Re: Matrici.. Come vengono allocate in memoria? (Stack e libera)

    lorenzosax ha scritto:


    Ok grazie di tutto
    Di nulla ... spero tu abbia risolto per il tuo problema/esercizio ...
Devi accedere o registrarti per scrivere nel forum
7 risposte