|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
[C] funzione calloc() per l'allocazione dinamica della memoria
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? |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
![]() 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).
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Dec 2000
Messaggi: 1303
|
Quote:
in uscita la funzione ti ritorna un puntatore a float
__________________
Psu CM RS-850-ESBA, Asus Prime-Pro X370 (bios 5606), Ryzen 5 3800x @stock (Wraith Prism cooler), 2x8Gb Ddr4 Vengeance Lpx 3200 CL16, Zotac Gtx 1070 Amp! Core Edition, Ssd Samsung 970 Evo Plus + 2x850 evo, Hdd WD Blue 2TB, DvdRw Lg Gh22ns30, Lcd Samsung T260HD (1200p@60hz) | Win10 Pro i7 3570k@stock, Asrock z77 Pro3 (bios 2.00), 2x2Gb G.skill Ripjaws Ddr3 1600, Sapphire R7 250 1Gb, Ssd Samsung 830, Hdd 300Gb, Win10 Pro - Ho concluso con: Iron 10, ciufoligo, Nicola[3vil5], iSux |
|
![]() |
![]() |
![]() |
#4 |
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
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) |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
Si il carattere '*' non può far parte del nome della funzione e quindi un prototipo del tipo
Codice:
float * fun(); Codice:
float *fun(); 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: Codice:
float mem1[]=calloc(100,sizeof(float)); Codice:
float mem1[]=malloc(100*sizeof(float)); |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:30.