PDA

View Full Version : [C] funzione calloc() per l'allocazione dinamica della memoria


D4rkAng3l
25-04-2005, 16:42
Mi sono messo a studiare il C perchè prima o poi l'esame di programmazione lo dovrò dare....

Da quello che ho capito quando invoco la funzione calloc gli passo il numero di elementi di un array da allocare dinamicamente e la dimensione degli elementi che lo compongono e mi restituisce il puntatore all'inizio di tale array...capito bene?

sul manuale fà un esempio:

Funzione che restituisce un puntatore a un array allocato dinamicamente contenente 100 valori float...vabbè apparte che nell'esempio non c'è il main ma solo la funzione ci sono delle cose che non ho capito...

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

float *get_mem(void){
float *p; // p è un puntatore ad un elemento di tipo float

/*Dico di allocare il vettore e metto in p l'indirizzo dell'inizio del vettore */
p=calloc(100, sizeof(float))
if(!p){
printf("Errore di allocazione\n");
exit(1);
}
return p; // Restituisci alla funzione chiamante l'indirizzo di inizio del vettore
}

La cosa che non ho capito è perchè la funzione la chiama:
float *get_mem(void)

ma che vuol dire che non riceve come argomenti alcun valore e restituisce un puntatore ad un dato di tipo float?

DanieleC88
25-04-2005, 17:49
ma che vuol dire che non riceve come argomenti alcun valore e restituisce un puntatore ad un dato di tipo float?
Cosa ci trovi di strano? :confused:
Significa che quella funzione non riceve e utilizza alcun parametro, e restituisce un puntatore a una variabile contenente dati di tipo float (che in questo caso è una array).

spedake
25-04-2005, 21:24
Mi sono messo a studiare il C perchè prima o poi l'esame di programmazione lo dovrò dare....

Da quello che ho capito quando invoco la funzione calloc gli passo il numero di elementi di un array da allocare dinamicamente e la dimensione degli elementi che lo compongono e mi restituisce il puntatore all'inizio di tale array...capito bene?

sul manuale fà un esempio:

Funzione che restituisce un puntatore a un array allocato dinamicamente contenente 100 valori float...vabbè apparte che nell'esempio non c'è il main ma solo la funzione ci sono delle cose che non ho capito...

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

float *get_mem(void){
float *p; // p è un puntatore ad un elemento di tipo float

/*Dico di allocare il vettore e metto in p l'indirizzo dell'inizio del vettore */
p=calloc(100, sizeof(float))
if(!p){
printf("Errore di allocazione\n");
exit(1);
}
return p; // Restituisci alla funzione chiamante l'indirizzo di inizio del vettore
}

La cosa che non ho capito è perchè la funzione la chiama:
float *get_mem(void)

ma che vuol dire che non riceve come argomenti alcun valore e restituisce un puntatore ad un dato di tipo float?

esatto, volendo nella definizione della funzione potresti anche omettere il void, ma hai fatto bene a metterlo, così è più leggibile...
in uscita la funzione ti ritorna un puntatore a float

D4rkAng3l
26-04-2005, 16:20
Grazie...

e se volessi mettere all'intestazione del programma il prototipo di tale funzione sarebbe sempre:

float *get_mem(void)

visto che tanto i parametri non ci sono e non devo mettere alcun tipo tra parentesi...giusto?

magari vi sembrerà stupido (cioè lo è) ma la cosa che mi aveva mandato in confusione è che in
*get_mem l'* è appiccicato al nome della funzione....

sarebbe stata la stessa cosa se avessi scritto così?:

float * get_mem(void)

tglman
26-04-2005, 16:49
Si il carattere '*' non può far parte del nome della funzione e quindi un prototipo del tipo

float * fun();

è uguale

float *fun();


Un particolare, non ti dimenticare il carattere ';' nei prototipi delle funzioni.
Un'altra piccola informazione, per sapere il numero di byte allocati ti è sufficiente moltiplicare i due parametri.
Infine non c'è nessuna differenza nella memoria allocata da queste due funzioni:

float mem1[]=calloc(100,sizeof(float));


float mem1[]=malloc(100*sizeof(float));


Ciao.