PROBLEMA [c] creazione matrice in funzione

Pubblicità

fenigo69

Utente Attivo
Messaggi
358
Reazioni
21
Punteggio
55
Salve a tutti, ho un semplice dubbio, è possibile inizializzare una matrice in una funzione ausiliaria e poi ripassarla al main? Mi spiego meglio, sò bene che posso creare una matrice nel main, poi passarla ad una funzione e modificarne il contenuto, quello che non capisco è se è possibile anche crearla in una funzione ausiliaria e poi utilizzarla nel main. Il mio dubbio perchè credo che il "malloc" chiamato nella funzione, crei la matrice nello heap, rendendola quindi invisibile al main...confermate? Esiste un altro modo per fare ciò? Allego anche un codice esempio per aiutarvi a capire meglio la mia domanda(scusate so che non mi sono spiegato proprio nel migliore dei modi...)

Codice:
int legge(char **a, int *len) {

  int i;
  scanf("%d", len);
  if(*len <= 0) return 1;

  a=malloc(*len * sizeof(char*));


  for( i = 0; i < *len; i++ ) {
      a[i]=malloc(101*sizeof(char));
  scanf("%s",a[i]);
  printf("%s",a[2]);/*prova*/}
 
  return 0;

}
 
Si, si può fare (almeno in c++ ma suppongo sia lo stesso in c... altrimenti ignora il mio reply xD), ecco come:

Codice:
const unsigned MATRIX_SIZE = 3;

int** MakeMatrix(int size)
{
    // make a pointer to array of pointer
    int** matrix = new int*[size];
    for (size_t i = 0; i < size; i++)
    {
        //make an array (an array is a pointer)
        matrix[i] = new int[size];
        //set initial value to 0
        for (size_t j = 0; j < size; j++)
        {
            matrix[i][j] = 0;
        }
    }
    return matrix;
}


int main()
{
    int** Matrix = MakeMatrix(MATRIX_SIZE);

    //print content
    for (size_t i = 0; i < MATRIX_SIZE; i++)
    {
        for (size_t j = 0; j < MATRIX_SIZE; j++)
        {
            cout << Matrix[i][j] << " ";
        }
        cout << endl;
    }

}

Risultato:
0 0 0
0 0 0
0 0 0

E si, l'array si trova nell'heap e quindi non ne devi perdere il pointer. (e non dimenticare di fare delete, come nel mio esempio :S)
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top