Newsgroup: it.comp.lang.c
Titolo: malloc e free

Ciao a tutti!
Avrei un piccolo dubbio da sottoporvi. :-)
Vi sembrerà ingenuo, ma ho scritto un programma in C che presenta
tutti i sintomi di uno scorretto uso della malloc o di qualche
puntatore mal utilizzato, e mi sono sorti un paio di dubbi.
La malloc serve ad allocare un certo spazio di memoria, il cui
ammontare viene derinifo dalla funzione sizeof, moltiplicata per la
quantità di spazio effettivamente necessario.
La free serve a svolgere l'operazione di liberare tale spazio di
memoria per renderlo utilizzabile da un'altra applicazione.
(se ho capito male correggetemi)
Eccoci al dubbio:
Se definisco un puntatore a stringa, per esempio nel seguente modo:
stringa = (char *)malloc(20 * sizeof(char));
e poi metto nello spazio allocato la stringa "pippo\0", se vado a fare
free(stringa), lo spazio viene liberato fino alla fine della stringa
(fino al carattere terminatore '\0') oppure fino alla fine della zona
di memoria, della quale la malloc tiene traccia da qualche parte?
Seconda domanda. Se chiamo la malloc da una funzione, e passo il
puntatore alla porzione di memoria allocata ad un'altra funzione, una
successiva malloc in un'altra porzione di memoria, può allocare la
stessa porzione di spazio, o si ricorda che l'avevo già allocata in
precedenza?
A leggere i testi che ho consultato sembrerebbe il contrario, ma nel
mio programma si verificano stranezze che non riesco a comprendere
completamente... :-(((
E la cosa brutta è che ieri sera non si verificavano, ma hanno
iniziato a manifestarsi stamattina! Cazzarola! :-)
Bene... spero di non avervi annoiato troppo e buon lavoro!

iniziato a manifestarsi stamattina! Cazzarola! :-)
Siamo seri :)
--
Andrea Laforgia - walkietalkie(at)
libero.it
#exclude <windows.h>

Siamo seri :)
Sono serissimo! ;-)
Il prof. mi ha chiesto di mostrargli i programmi che ho svolto per
esercitarmi, e di spiegarli. E' stato molto soddisfatto, e gli è
piaciuta la mia tesina (il programma di cui parlavo nel msg
precedente).
Fortunatamente se n'è andato poco dopo, perché sono riuscito a
SPEGNERE il computer... :-?
Ho inserito un nuovo elemento nella lista in memoria, chiuso il
programma (che automaticamente ha salvato il contenuto della memoria).
Ho riavviato il programma per verificare il corretto caricamento dei
dati da disco, et voilà!...
Puff!!...
Si è spento senza la consueta pausa ("Arresto del sistema in corso").
Mah... (?)
 :-)
Si vede che ho avuto fortuna in precedenza...

stringa = (char *)malloc(20 * sizeof(char));
occhio sul NG girano un sacco di accademici
a me per un sizeof(char) mi hanno crocifisso

 a me per un sizeof(char) mi hanno crocifisso
Non credo perchč cosě č piů portabile o no?...invece ci sarebbe da
crocifiggere sul casting.

crocifiggere sul casting.
Preferisco la crocifissione ad un costante "suspicious pointer
conversion" del compilatore... :-))) Byeeee!!!

 ha scritto nel messaggio
news:hn2kit8npevr1lfd3...@4ax.com...

Non stai compilando in c ovviamente ma in c++. Comunque se ne è già parlato
parecchio di questo...prova a dare un occhiata ai post precedenti.

a me per un sizeof(char) mi hanno crocifisso
accademici = persone che conoscono il C
Hai scarsa memoria.
La questione non riguardava sizeof(char) (che vale sempre 1 su
qualsiasi piattaforma) ma il cast sul valore di ritorno di malloc
(e la cosa e' molto diversa).
Ma non eri tornato a lurkare ?


tu hai scarsa memoria riguardo .............. al cast sugli indirizzi ( non
sui valori )...........
la pensiamo allo stesso modo ........ (solo quello per fortuna)
Per quello che riguarda
sizeof(char) = 1 = byte(del c)   ....... sempre
mi è rimasto aperto un processo in background ;
allora  dai problemi teorici a quelli pratici :
se su un sistema pc compatibile ho un programma che gestisce un database
struct rubrica
{
char nome[20];
char cognome[20];
char indirizzo[20];
char telefono[20];
}
mettiamo che siano 100.000 record
dovrebbero occupare 8.000.000 byte che sul pc vale 8 bit
ora non so perchè ..... ma migro su un sistema   in cui il char è di 16
bit........., perchè ?
perchè sono cinese !!!
perchè saranno pure cavoli miei !!!!!
e la chiamiamo CHINASYSTEM
ricompilo lo stesso programma che è "rigorosamente portabile" perchè
rispetta ANSI ISO e .....zzi tuoi
voglio condividere  il mio file rubrica in rete  , che risiede sul PC
compatibile .......
il CHINASYSTEM invece di leggere un record da 80 byte da 8 bit ciascuno mi
leggerà 80 byte da 16 bit cioè due record del sistema pc
.............alla faccia della portabilità  ...................
.............quindi mi toccherà gestirlo in maniera diversa sui due sistemi
e manco in maniera tanto facile ......................
l'ANSI e ISO farebbero bene a introdurre un tipo di dato........
possibilmente con dimensioni in bit uguale per tutte le piattaforme
...........
.... forse è solo una mia idea ...........
................forse sbagliata ........................
.............forse mi darai del coglione per l'ennesima volta
............forse tu sei il miglior programmatore del pianeta .........
ma sicuramente tu mi stai pesantemente sulle palle ..................a
livello umano
caro il mio CLEM CLEM

 sistemi e manco in maniera tanto facile ......................
E scrivi un po' meglio cavolo !
Se haio simili problemi di portabilità significa che devi usare un 
linguaggio migliore, del tipo
VB, C#
La' senz'altro non si porranno problemi di portabilità ( sei OBBLIGATO ad 
avere la stessa macchina !!! ); anche perchè il problema maggiore non è 
tanto la dimensione del tipo di base, ma anche l'ordine dei bit ( 
little/big endian ), eventuale padding sulle strutture...
Se anche lo standard decidesse :
"il char sono 45 bit" ( perche' sicuramente prima o poi conosceremeo degli 
extraterrestri con un alfabeto con 2^45 simboli )
Questo significa perà che il C non sarebbe portabile su tutte le 
architetture, passate e future

 bit........., perche` ?
Se il byte  su quel computer e`  composto da 16bit allora  anche il char
sara` di 16bit. Nel caso  che il computer abbia 1 byte  == 8 bit, allora
il char  rimarra` di  8bit, mentre  per la  rappresentazione del  set di
caratteri dovra` essere usato il tipo wchar_t (definito dallo standard).
Il tutto ovviamente AFAIK
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Windows NT crashed.
I'm the Blue Screen of Death.
No one hears your screams.

 piattaforme
  Non servirebbe a nulla, nello specifico.
	Alla prossima,
		Marco

caro il mio CLEM CLEM
Ti avrei risposto seriamente, ma da vero imbecille hai concluso
il messaggio in modo da non meritarti una risposta seria. 
Ti sto sulle palle perche' ti ricordo che non conosci il
linguaggio ? Hmmm... non mi sembra sufficiente.
Effettivamente, il mio killfile necessitava di qualche elemento
in +.  Torna a lurkare, impara il C (e in particolare cosa e' il
tipo wchar_t).


linguaggio ? Hmmm... non mi sembra sufficiente.
certo io non conosco il C
:-P
per questo in C ho scritto per lavoro :
Software per riconoscimento marcature con scanner Canon IX8
un convertitore di protocollo Teletetext
software per centralina telefonica 24 linee esterne 8 interne
software per acquisizione/elaborazione immagini radiografiche
(768x1024 su ATVista gpu 34010 e relativo tool di sviluppo)
libria di funzioni per gestire Videodischi e Stampanti video Sony
ecc.. ecc.. ecc...
ANSI & ISO stanno alle applicazioni reali come
IL LEGISLATORE all'applicazione della legge
Infatti ogni compilatore ha delle caratteristiche proprie ,che vanno
fuori dallo standard ........e che diventano l'ago della bilancia per il
programmatore professionista al momento di decidere cosa usare per
sviluppare .........
IMHO
il re degli ignoranti 
inixor ollen

 per questo in C ho scritto per lavoro :
Conosci forse un linguaggio che tu _credi_ sia il C mentre in realtà è
qualcos'altro. Il fatto che tu ci abbia scritto dei software funzionanti
non significa automaticamente che sia il linguaggio C conosciuto dal
resto della popolazione mondiale.
EMG

vecchi VAX, i quali, per inciso, avevano i byte da nove bit).
Scusa Marco se rispondo quà...........
I processori Intel a partire dal 486 (sono sicuro al 99.9%) gestiscono
entrambi
"big endian" /"little endian"
Credo (sono sicuro all'89% )che usando un ambiente Posix usando una
read,write su disco il problema dell'ordine dei bit non si doverebbe
porre....
 mi cadrebbero i pochi capelli rimasti al pensiero che portare un file mp3
da un pc a un mac (magari anche a parità di os [linux]) comporterebbe
anche una modifica del programma di lettura e decodifica del file oltre a
quello di play ........
Io tutta sta storia l'ho tirata fuori per dire [*]
e che :
void main(void) è lecita ............
e in qualche caso ,per me .............. utile ...............
e ......ci ho ripensato .............anche il cast sugli indirizzi ha una
sua utilità ....... (non tra indirizzi)
Il C è stato scritto nel 1969 quando la diffusione dell'informatica non era
quella di oggi ,
i chip maker sfornano cpu come i biscotti (forse in produzione battono pure
il mulino bianco).......
se il C ,"come si diceva ai miei tempi", deve diventare l'ASSEMBLER del
futuro
l'utilizzo di tipi come [**]  risparmierebbe al pianeta qualche miliardata(o
qualche bilione) di righe di codice .............
sempre .......e tutto .........IMHO
il vostro gnorantissimo
inixor ollen

 sempre e tutto IMHO
  Certo, i pareri personali sono ben accetti. Ma ci sono anche i
regolamenti da rispettare, e questi sono quelli che ho citato sopra.
	Alla prossima,
		Marco

tutto eccezionale, deroghe sui varii dialetti.
mi arrendo .............
ho capito solo adesso che le parole ......... senso pratico ...........
dagli anni 90a in poi hanno completamente perso di significato...........
auguri ..............
Vorrà dire che chiederò a qualcuno se ha voglia di aiutarmi
a scrivere un nuovo linguaggio con queste parole chiave:
    auto, double, int, struct
    break, else, long, switch
    case, enum, register, typedef
    char, extern, return, union
    const, float, short, unsigned
    continue, for, signed, void
    default, goto, sizeof, volatile
    do, if, static, while
    binary8, binary16, binary32,binary64
è un nuovo linguaggio derivato dal C .........
ammette l'espressione:
void main(void) /* perchè non ha senso tornare un valore quando scrivi un
bios o un'applicazione embedded ! */
ammette le espressioni:
typedef struct{
                        binary8 red;
                          binary8 green;
                            binary8 blue;
                              binary8 alpha;
                         }RGB;
binary32 addr_framebuffer,max_framebuffer;
RGB *framebuffer;
framebuffer=malloc(307200*sizeof(RGB));
max_framebuffer=LoadImage("./sfondo.bmp",framebuffer);
if(max_framebuffer!=0)
             for
(addr_framebuffer=0;addr_framebuffer<max_framebuffer;addr_framebuffer++)
framebuffer[addr_framebuffer].red++;/* voglio l'immagine più rossa
:::::::::::c() */
[***]
Molto adatto per scrivere firmware,driver,applicazioni embedded ,gui e
kernel di sistemi operativi ...............
richiede tuttavia una buona apertura mentale dei programmatori
............(e sconsigliato ai programmatori C ISO ANSI..A dipendenti )
come lo chiamiamo:
 gnu_rant_C
Non essendo definito uno standard ANSI ISO OSI per il linguaggio
potete discuterne le caratteristiche  sul NG   it.comp.lang.gnu_rant_C
e inviare i vostri suggerimenti per migliorarlo a inixor.ollen@gnu_rant_C
le specifiche sono disponibili sul sito 
www.gnu_rant_C.org
gnurantemente
inixor ollen

inixor ollen
Il problema non e' essere ignoranti. Tutti siamo ignoranti.
Il problema non e' nemmeno dire cretinate come fai tu.
Tutti diciamo cretinate.
Il problema e' invece quando una volta che le cretinate
sono state dette le si difende ad oltranza anche di fronte
all'evidenza. Questo e', a mio parere, quello che
differenzia un imbecille da una persona ragionevole.
Al non sapere nulla c'e' rimedio. Anche all'aver detto delle
cretinate si puo' rimediare (basta informarsi e dire "whoops...
avete ragione" ... e magari informarsi meglio sulla cosa di
cui si parla prima di parlare ancora).
Con l'imbecillita' la questione e' invece un po' piu' complessa.
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

void main(void) č lecita ............
ok, ma poi non stupirti se ti dicono che non conosci il C...
Anto
--
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 e in qualche caso ,per me .............. utile ...............
Ecco un'altra conferma. Utile poi... mah...
EMG

tornare indietro come boomerang" (come direbbe Fantoni).
inixor ollen =Nello Roscini
non serve un genio per capirlo ........
SMAU 87 allo stand Canon con il riconoscimento di marcature
5 anni dopo a quello Sony con i driver e applicazioni per i Worm
Ottici,Videodischi e stampanti a sublimazione.
In mezzo  un viaggio in South Africa con una macchina a raggi X ...
Io vivo di fatti ........dire o fare  qualche cazzata (ammesso che lo sia)
non compromette i fatti già fatti :-) ............
.......mi spiace .........
sapevo che programmare in C aumenta la pignoleria  ........
ma io in questi anni ho imparato a scendere a compromessi pur di raggiungere
i miei obbiettivi in tempi ragionevoli .......
e non credo di essere il solo  ............
ora voi mi dite che il C ISO ANSI è il monolita di 2001 odissea nello spazio
e non va discusso .........
e tutti devono programmare secondo le specifiche........
ok lo accetto (nel senso che gli dò un'accettata)
Allora ho deciso di non programmare in C
ma come ho detto a Marco
.........in un'altra cosa molto simile al C
                  e credo che ....... come me la pensino altri
e vi saluto
e visto che per qualcuno non posso nemmeno essere ignorante
antipaticamente
Inixor........Inixor Ollen
Omer ........Omer .....Simpson

ignorante antipaticamente
Che tu sia ignorante sui puntatori e sizeof(char) e'
lampante ma non grave. Mi spiace che tu pretenda invece
che queste conoscenze ti siano state "infuse" tramite
qualche meccanismo strano perche' in passato hai fatto
o credi di aver fatto grandi cose.
"Nessuno nasce imparato"... e con cose come il C o il
C++ l'intelligenza (la logica) non basta per niente.
Un sacco di cose sono come sono per ragioni storiche
di evoluzione... non sono la cosa piu' logica oppure
sono la cosa logica solo se si inquadra il problema nel
contesto globale; pretendere che tu le deduca tutte
senza leggere e senza conoscere il contesto in cui sono
state prese le decisioni e' un pochino troppo, non trovi ?


 dagli anni 90a in poi hanno completamente perso di significato...........
Credo invece che tu ti stia facendo influenzare troppo dalle mode e poco
dalla scienza informatica.
EMG

 auguri 
  Anche a te.
	Alla prossima,
		Marco