Newsgroup: it.comp.lang.c
Titolo: allocazione dinamica

Salve a tutti,
avrei un paio di dubbi sulla allocazione dinamica della memoria. Spero che
qualcuno possa aiutarmi a chiarirli.
1. che differenza c'è tra fa funzione
        void *malloc(size_t size) e
        void *calloc(size_t num, size_t size)
    con entrambe posso allocare la quantità di memoria che mi serve, ma
perchè e quando scegliere tra l'una o l'altra?
2. la memoria allocata con una delle due funzioni va comunque e sempre
rilasciata con void (free *ptr) oppure terminata l'esecuzione del programma
ciò avviene automaticamente e quindi la funzione free va usata solo se
intendo utilizzare la stessa area di memoria ma in modo differnte?
Grazie,
Gianandrea

 di memoria ma in modo differnte?
  Che tu possa usare la *stessa* area di memoria e` fortemente
dipendente dal sistema e dalle funzioni della libreria, invece e` un
fatto che non rilasciare la memoria quando non serve piu` porti a gravi
inconvenienti (cfr. Microsoft Windows NT 4.0 pre SP 3).
 
	Alla prossima,
		Marco

intendo utilizzare la stessa area di memoria ma in modo differnte?
E' sempre bene rilasciarla esplicitamente.

 intendo utilizzare la stessa area di memoria ma in modo differnte?
In effetti il sistema operativo dovrebbe provvedere a liberare la
memoria ma è meglio non farci affidamento e liberarla esplicitamente.
EMG

gli altri versi identico.
Tra l'altro credo che il djgpp implementi calloc() come una chiamata a
malloc(), almeno se non ricordo male.

 intendo utilizzare la stessa area di memoria ma in modo differnte?
Mah, un sistema operativo come si deve, libera tutte le risorse che un
processo ha utilizzato alla terminazione del processo stesso; non e'
pero' una cosa igienica fare affidamento su questo presupposto e
quindi uno stile di programmazione "ordinato" e "previdente"
suggerisce di fare una free() di tutta la memoria allocata prima della
terminazione del processo. Per esemplificare, praticamente tutto il
mondo unix garantisce il rilascio della memoria alla terminazione dei
processi; il mondo MS un po' meno...
--
 Ciao, Luca.
 Reply to 
luca....@tiscalinet.it

 malloc(), almeno se non ricordo male.
Possibilissimo. Sarebbe comunque la cosa più ovvia da fare.
EMG

 frequente). In tutti gli altri casi usare malloc().
malloc() è più veloce di calloc(), ovviamente, quindi, se non hai bisogno di
avere il blocco settato a 0 (ad esempio perchè sai già di doverla riempire
con dei valori...), conviene usare la prima...
--
Marco Iannaccone
marc...@tin.it
Nick: Tolkien
ICQ UIN: 18748121
"This is a new ship, boy, but she's got the right name...
You treat her like a lady, and she'll always bring you home"
"Questa è una nave moderna, ma ha un nome antico e glorioso...
Trattala come una signora e ti riporterà sempre a casa"
FAQ di it.comp.lang.c:
http://www.programmazione.it/linguaggi/c/itcomplangc.htm
FAQ di it.comp.lang.c++:
http://www.programmazione.it/linguaggi/c/lang_faq.htm

you wrote:

Infatti, come supponevo :
/* Copyright (C) 1994 DJ Delorie, see 
COPYING.DJ
 for details */
#include <stdlib.h>
#include <string.h>
void *calloc(size_t size, size_t nelem)
{
  void *rv = malloc(size*nelem);
  if (rv)
    memset(rv, 0, size*nelem);
  return rv;
}
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
-----------------------------------------------------------------------
"There is nothing better for understanding a kangaroo than seeing it jump."
[D.Grune, C.J.H. Jacobs]

Grazie 1000 a tutti!
Gianandrea