Allocazione dinamica in C

wedge
non riesco ad allocare dinamicamente lo spazio per una matrice per crearne una con delle dimensioni scelte dall'utente...

per un vettore faccio così...

int main ()
{
int *vettore;       /* dichiarazione del vettore */
int n;
(...)
printf("dimmi di quanti elementi vuoi il vettore"); 
scanf("%d",&n);       /* l'utente mi dice la dimensione del vettore*/
vettore=malloc(n*sizeof(int))  /*allocazione di spazio*/
(...)
}



ma per una matrice come funziona???? istintivamente farei:


int main ()
{
int *matrix;       /* dichiarazione*/
int n;
int m;
(...)
printf("dimmi di quante righe e colonne vuoi la matrice"); 
scanf("%d %d",&n,&m);       /* l'utente mi dice le dimensioni della matrice*/
matrix=malloc(n*m*sizeof(int))  /*allocazione di spazio*/
(...)
}


purtroppo il compilatore non me l'accetta...

qualche suggerimento? grazie mille :D

Risposte
Marvin1
non so perchè ma qualcosa mi dice che il problema è quando fai la malloc...che errore ti da?

wedge
mi dice qualcosa come "incompatible type for array", esattamente alla linea corrispondente al malloc, come hai intuito!

signor.nessuno1

wedge
"signor.nessuno":
[quote="wedge"]
scanf("%d %d", n, m);       /* l'utente mi dice le dimensioni della matrice*/


Forse perché mancano gli operatori indirizzo per le due variabili?[/quote]

pardon, questo è un refuso della scrittura del post. correggo.

signor.nessuno1

Marvin1
Predila con le pinze eh..se tu devi creare un matrice n*m devi per esempio accostare n righe da m elementi ciascuna,giusto?
Ricordati che n,m sono SCALARI (integer) e andando a fare n*m hai uno SCALARE,non un vettore.
Ora provo a vedere sui miei appunti di C se trovo qlc relativa alla malloc per generare la matrice.
Forse è per questo che ti da errore.

Marvin

luciano791
è da anni che non utilizzo il c...
credo che tu debba fare così

matrix=(int*)malloc(n*m*sizeof(int));

ilprincipe1984
potrei sbagliarmi ma da qualche vago ricordo mi pare che tu abbia sbagliato funzione...quando vuoi definire la taglia utilizzi calloc, quando utilizzi malloc devi passare il numero di elementi per la taglia, quindi n*sizeof(int) significa allocami n elementi di tipo int, non allocami uno spazio di memoria pari a... ed è per questo che con il cast dovresti risolvere..invece se utilizzi calloc puoi passare la taglia forzata..o qualcosa del genere...fregandotene di tutto

giacor86
ma scusa, fai una bella lista dinamica...

Bemipefe
Allora vediamo se riesco a dire qualcosa di senzato......
Le funzioni per l'allocazione dinamica sono:

"calloc" e "malloc"

Bisogna distinguere innanzi tutto che la prima riceve due parametri, mentre la seconda un solo parametro.

Infatti i prototipi sono.
calloc(n , size_elem) /*In cui "n" è il numero di elementi creati i quali sono grandi "size_elem"*/
malloc (size_elem) /*In cui "size_elem" è la grandezza dell'unico elemento creato*/


Tu usi
malloc( (n*m*sizeof(int)) );


sappi che questo è esattamente uguale a
calloc(n*m , sizeof(int));


L'errore comunque stà nelfatto che non hai messo il punto e virgola alla fine della malloc.
Prova....facci sapere.

gigilatrottola2
Prorabilmente se pensassi alla matrice come un vettore di vettori ti verrebbe piu semplice.

Questo significa dover usare però un doppio puntatore.
Ad esempio:

int **matrix;

Dopodichè allochi lo spazio per il vettore di vettori (le colonne)
matrix = (int **)malloc(m * sizeof(int *));

Ed infine allochi n spazio per ciascuno degli m elementi con un ciclo (la riga per ciascun elemento della colonna)
for(i = 0; i < m; i++)
*(matrix+i) = (int *)malloc(n * sizeof(int));

p.s. *(matrix+i) equivale a matrix

;)

p.p.s. ovviamente puoi poi accedere a ciascun elemento con la notazione matrix[j] cosa che non puoi fare se allochi la matrice come un semplice vettore.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.