Il codice è questo:
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
int **prova(int N); // prototipo funzione
int main()
{
int NN = 4, i, j; // NN è il numero numero di righe-colonne della matrice quadrata NNxNN
int **y;
y = prova(NN);
printf("**y = %d *(*y + 2) = %d\n", **y, *(*y + 2)); // Qui **y è ok, e mi stampa il valore esatto a cui punta
printf("Stampa matrice dentro il main:\n");
for (i = 0; i < NN; i++) {
for(j = 0; j < NN; j++) printf("%3d ", *(*y + NN*i + j)); // Qui invece è come se **y perdesse l'indirizzo che contiene come valore..
printf("\n");
}
return 0;
}
int **prova(int N)
{
int i, j, t = 2;
int *Q = malloc((N*N)*sizeof(int)); // alloca la memoria per la matrice NxN
int **M = &Q;
for (i = 0; i < N; i++) { // riempie la matrice con valori di prova (cioè t++)
for(j = 0; j < N; j++)
*(*M + N*i + j) = t++;
}
printf("Stampa matrice dentro la funzione:\n");
for (i = 0; i < N; i++) {
for(j = 0; j < N; j++) printf("%3d ", *(*M + N*i + j));
printf("\n");
}
int *PP = &M[0][0]; // Puntatori ausiliari
int **G = &PP;
return G;
}
Come potete vedere, è come se entrando nei due for nel main, **y perdesse l'indirizzo a cui punta, mentre il printf precedente stampa correttamente i due valori (0,0) e (0,2) della matrice "ricevuta".bash-4.1$ a.out
Stampa matrice dentro la funzione:
2 3 4 5
6 7 8 9
10 11 12 13
14 15 16 17
**y = 2 *(*y + 2) = 4
Stampa matrice dentro il main:
Segmentation fault
bash-4.1$
Suggerimenti?